The member module

Quick Notes

On this page :

Also see :


Introduction to the member module :

Some member attributes are read-only . You can create a script that reads a read-only attribute, but that attribute cannot be assigned to a parametrically added member, and it cannot be updated on an already added member.

Other member attributes are not updatable . You can assign a not updatable attribute to a members when you add it parametrically. However, a not-updatable attribute cannot be updated on an already added member.

For member attributes that are Updatable , use mem1.Update() to update them.

The global methods for declaring a member object are discussed under mem1 = .

Attributes can be assigned to member objects.

Methods (functions) operate on member objects.


Declaring a member object & selecting members :

mem1 = MemberLocate("prompt_string") or mem1 = Member(mem_num) declares a member object. In order for most parametric scripts to Run properly, a member must be defined as an object so that you can add submaterial to it, or update its attributes, or read its attributes.

MemberLocate("prompt string") prompts the user in the status line with the "prompt string" that is entered. Left-click ( Select ) selects a member (returns a member object). Right-click ( Menu ) returns member.error: Member selection is canceled . When a member is selected using MemberLocate() , it is highlighted in the " Secondary selection surface color " so that the user doesn't select that member again while the same script is running or when different scripts are running. To clear the selection, you can use ClearSelection() .

# Loop for selecting multiple members with MemberLocate.
from member import MemberLocate
from param import yes_or_no, ClearSelection
import member       # to catch the exception
response = 1
while response:
    mem1 = MemberLocate("Select a member")
    response = yes_or_no("Select another member?")
print("You have ended this operation.")

Member(mem_num) is the member in your current Job that has been assigned the member number (an integer > 0) that is referenced in parentheses ( mem_num ). Entering a member number that does not exist in the model returns member.error: Illegal member number . Be aware that members that are quite different from one another may have the same member number if they reside in different SDS2 Jobs.

# Selects the member whose number the user enters.
from member import Member
from param import Prompt, SelectionAdd
import member   # to catch the exception
try:
    mem_num = Prompt(5, "Enter a member number")
    SelectionAdd(Member(mem_num))
except member.error:
    print("The member does not exist or has been deleted.")

MultiMemberLocate("prompt string") creates a list [ ] of member objects from the members that the user selects. When a Python script with the line mem_list = MultiMemberLocate("Select members") is Run the script activates Select Items mode mouse bindings so that you can select multiple members to include in the list ( mem_list ). If there is already a selection (for example, due to Advanced Selection ), the user can press the Enter key (or right-click and choose " OK ") to create the list from that pre-selection.

# Prints list of selected members.
from member import MultiMemberLocate
mem_list = MultiMemberLocate("Select members")
print("The selected members are: ", mem_list)
# Processes the selected members.
from member import *
from job import ProcessJob
mem_list = MultiMemberLocate("Select some members")
for each_mem in mem_list:
    MarkMemberForProcess(each_mem)
ProcessJob()

Note: If the user right-clicks and chooses " Cancel " instead of selecting members, Python throws a SystemError exception . The following script catches the exception and prints " You canceled without selecting any members! " in its place:

# Prints the [member number] of each member in the selection.
from member import MultiMemberLocate
try:
    mem_list = MultiMemberLocate("Select some members")
    print("You selected the following members:")
    for each_mem in mem_list:
        print("[",each_mem.MemberNumber,"]",)
except SystemError:
    print("You canceled without selecting any members!")

See GroupMemberCreate(mem_list) for an application of this function.

Sets type of member to be added :

memadd = is for adding a member.

memadd1 = Member('Type') begins a member add operation. ' Type' can equal: 'Beam' or 'Column' or 'VBrace' or 'HBrace' or 'Joist' or 'Girt' or 'Purlin' or 'Misc Rolled Section' or 'Misc Rectangular Plate' or 'Misc Round Plate' or 'Misc Bent Plate' or 'Misc Rolled Plate' or 'Misc Flat Plate Layout' or 'Misc Bent Plate Layout' or 'Misc Round Bar' or 'Misc Square Bar' or 'Misc Flat Bar' or 'Misc Grating' or 'Misc Grating Tread' or 'Misc Decking' or 'Misc Shear Stud' or 'Misc Clevis' or 'Misc Turnbuckle'.


Method for returning a model object :

obj.modelobject can be used to return a model object, whose attributes can be read/written to using parametric code from the model module. Following are two examples that you can type at the Python Prompt :

For this example, you need to select a member, and ClearSelection() needs to be done to clear the selection.

SDS2 Python Prompt

>>> import member >>> member.MemberLocate('select a member').Material(0).modelobject() <material 0 of member 8> >>> from param import ClearSelection >>> ClearSelection()

For this example, you don't have to select the member, but you still need to use ClearSelection() if you want to clear the selection.

SDS2 Python Prompt

>>> member.Member(2).Material(0).modelobject() <material 0 of member 2> >>> ClearSelection()

Member attributes independent of member type :

Member attributes listed below are marked ( read-only ) or ( not updatable ) where applicable.

Member custom properties :

MemberProperties(mem_obj) returns a dictionary of the custom properties -- including the " Properties " " Log " and " Notes " -- that are assigned to the member object ( mem_obj ). ( read-only )

# Prints properties, log and notes for selected member.
from member import MemberLocate, MemberProperties
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
all_props = MemberProperties(mem1)
print(all_props)
ClearSelection()
# Prints the member property keys (names, etc.).
from member import MemberLocate, MemberProperties
from param import ClearSelection
ClearSelection()
prop = MemberProperties(MemberLocate("Select a member"))
print(prop.keys() # .keys() is a Python method for dictionary objects)
ClearSelection()
# Prints the entry to the property named 'Painted'.
from member import MemberLocate, MemberProperties
from param import ClearSelection
ClearSelection()
prop = MemberProperties(MemberLocate("Select a member"))
print(prop['Painted'])
ClearSelection()
# Prints the event log of the member that the user selects.
from member import MemberLocate, MemberProperties
from param import ClearSelection
ClearSelection()
prop = MemberProperties(MemberLocate("Select a member"))
print(prop['Log'])
ClearSelection()
# Prints the user notes of the member that the user selects.
from member import MemberLocate, MemberProperties
from param import ClearSelection
ClearSelection()
prop = MemberProperties(MemberLocate("Select a member"))
print(prop['Notes'])
ClearSelection()

MemberPropertySet(mem_obj, "field" or "Notes", "setting") sets the member custom property ( "field" ) on the member object ( mem_obj ) to a setting ( "setting" ), or appends a note ( "Notes" ) whose string is the "setting" .

# Enters string "John Doe" to property "modeled_by".
from member import MemberLocate, MemberPropertySet
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
MemberPropertySet(mem1, "modeled_by", "John Doe")
ClearSelection()
# Note: "modeled_by" must be string property
# Checks box for custom property "needs_paint".
from member import MemberLocate, MemberPropertySet
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
MemberPropertySet(mem1, "needs_paint", "True")
ClearSelection()
# Note: "needs_paint" must be a boolean property
# Enters dimension "12.0" for property "offset".
from member import MemberLocate, MemberPropertySet
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
MemberPropertySet(mem1, "offset", "12.0")
ClearSelection()
# Note: "offset" must be a dimension property
# Writes a "Note" for the member that the user selects.
from member import MemberLocate, MemberPropertySet
from param import ClearSelection
mem1 = MemberLocate("Select a member")
MemberPropertySet(mem1, "Notes", "Refer to RFI 32")
ClearSelection()

Tip: To update member settings that are not custom properties, use mem1.Update() .

General member attributes

mem1 .MemberNumber ( mem1.number ) returns the member number (an integer > 0) of the member. ( read-only )

# Processes the one member that the user selects.
from member import MemberLocate
from job import ProcessOneMem
from param import ClearSelection
    mem = MemberLocate("Select one member")
    ProcessOneMem(mem.MemberNumber)
    ClearSelection()

mem1 .Piecemark ( mem1.piecemark ) = the user piecemark of mem1. The user piecemark must be entered as a string "in quotes". Returns both system and user piecemarks.

# Prints the piecemark of the member that the user selects.
from member import MemberLocate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
print("The piecemark is: ", mem1.Piecemark)
ClearSelection()

mem1 .ManufacturingGUID returns the GUID (Global Unique Identifier) of the member object. Each member in a Job has an unique GUID that remains associated with it even if the properties of the member are altered. For example, a member's GUID is maintained even if it is assigned a new piecemark. Theoretically GUIDs are never duplicated -- even in different Jobs. ( read-only )

# Prints the GUID of the selected member.
from member import MemberLocate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
print("GUID =", mem1.ManufacturingGUID)
ClearSelection()

mem1 .MrpUniqueIdentifier returns the FabTrol GUID of the member object. This is the " database id " that can be found in the fabtrol_assembly_parts_list.XSR file. You need to have done a FabTrol Export before you can get this FabTrol GUID assigned to members in the SDS2 model. A value of -1 is returned if a FabTrol GUID has not been assigned. ( read-only )

# Prints the FabTrol ID of the selected member.
from member import MemberLocate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
if mem1.MrpUniqueIdentifier != -1:
    print("FabTrol GUID =", mem1.MrpUniqueIdentifier)
else:
    print("A FabTrol GUID has not been assigned.")
ClearSelection()

mem1 .Type ( mem1.type ) returns "Beam" or "Column" or "Vertical Brace" or "Horizontal Brc" or "Joist" or "Girt" or "Purlin" or "Misc" or "Stair" or "Custom" ( read-only )

Example 1: You Run the following script and left-click ( Select ) a beam. The script prints the word "Beam" to the report viewer ( Output-Request Summary ):

# Prints the member type of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("select a member")
print("The member type is: ", mem1.Type)
ClearSelection()

Example 2: Here MultiMemberLocate() is used to select multiple members, and each_mem.Type is used to filter the selection so that only beams are appended to the beam_list . The script prints len(beam_list) , which is equal to the number of beams that are selected and is also equal to the number of items in the beam_list .

# Prints the number of beams that you select.
from member import MultiMemberLocate
beam_list = [ ]
mem_list = MultiMemberLocate("select some members")
for each_mem in mem_list:
    if each_mem.Type == "Beam":
        beam_list.append(each_mem)
print("Number of beams selected: ", len(beam_list))

mem1 .Galvanized ( mem1.is_galvanized ) returns "Yes" or "No" depending on whether the box for " Galvanized " is checked ("Yes") or not checked ("No") on the member edit window. ( read-only )

 # Prints Yes if the member is galvanized, No if it is not.
from member import MemberLocate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a member")
print(mem1.Galvanized)
ClearSelection()

mem1 .QuantityOnDetail ( mem1.detail_quantity ) returns the quantity (an integer >= 0) of members in the model that are under the same member mark . ( read-only )

mem1 .OverallDimensions returns X, Y and Z member axes distances that correspond to the member's bounding box. ( read-only )

# Prints the overall dimensions of the selected member.
from member import MemberLocate
from param import ClearSelection, Units, dim_print
Units("feet")
ClearSelection()
mem1 = MemberLocate("Select a member")
print("Member length:", dim_print(mem1.OverallDimensions.X))
print("Member depth:", dim_print(mem1.OverallDimensions.Y))
print("Member width:", dim_print(mem1.OverallDimensions.Z))
ClearSelection()

mem1 .WorkpointToWorkpointSlope ( mem1.input length ) returns the member's length as calculated from the X, Y and Z global coordinates of its work points. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . For a beam, this is the " WP to WP Length: actual " on the Beam Edit window. ( read-only )

mem1 .MainMaterialLength ( mem1.length ) returns the actual length of the member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . For a beam with no end connections, this is the overall dimension reported on the beam detail. ( read-only )

mem1 .WorkpointToWorkpointLevel ( mem1.plan_length ) returns the member's length as calculated from the X, Y global coordinates of its work points. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . For a beam, this is the " WP to WP length: plan " on the Beam Edit window. ( read-only )

mem1 .PlaneAngleOfRotation ( mem1.plan_rotation ) returns the number of degrees of rotation from horizontal in an X, Y plane. ( read-only )

mem1 .MemberSlope ( mem1.slope ) returns the number of (+) or (-) degrees that the member slopes from horizontal. ( read-only )

Main material attributes (except angles)

mem1 .FlangeWidth ( mem1.bf ) returns the " Flange width " that is reported in the local shape file for C or WT , ST , W or S member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .Depth ( mem1.depth ) returns the " Depth " that is reported in the local shape file for C , HSS round or HSS rectangular or WT , ST , W or S member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

Example: Entering var = mem1.Depth returns the depth of the main material of mem1 .

Note: For angle main material use SL_depth or LL_depth ; for tube use long_depth or short_depth ;

mem1 .FlangeGage ( mem1.gage ) returns the " Flange gage " that is reported in the local shape file for C or WT , ST , W or S member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .MomentOfInertiaXAxis ( mem1.Ix ) returns the " Moment of inertia " reported in the local shape file for C, L, pipe, WT, tube or W member main material. ( read-only )

mem1 .kDistanceDetail ( mem1.k ) returns the " k distance " that is reported in the local shape file for C, L, WT or W member main material. A distance is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .long_depth returns the " Long side depth " that is reported in the local shape file for tube member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .MaterialType ( mem1.mtrl_type ) returns the member main material " Material type " (W flange or Channel or Angle or W Tee or Pipe or Tube or Joist or Welded Plate Wide Flange) reported in the local shape file . ( read-only )

# Prints the material type of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("select a non-misc member")
if mem1.Type != "Misc":
    print("The main material is: ", mem1.MaterialType)
else:
    print("Please select a non-miscellaneous member.")
ClearSelection()

Note: MaterialType is not a valid attribute for a miscellaneous member. Both the above script and the following script filter out miscellaneous members that may be selected using MultiMemberLocate() .

# Prints the material types of non wide flange members.
from member import MultiMemberLocate
non_wide_flange = [ ]
mem_list = MultiMemberLocate("Select some members")
for each_mem in mem_list:
    if each_mem.Type != "Misc":
        if each_mem.MaterialType != "W flange":
            non_wide_flange.append(each_mem)
for mem in non_wide_flange:
    print(mem.Piecemark, mem.MaterialType)

mem1 .NominalDepth ( mem1.nom_depth ) returns the " Nominal depth " that is reported in the local shape file for C, pipe, WT, W or joist material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

Example: Entering var = mem1.NominalDepth returns the nominal depth of the main material of mem1 .

Note: " Nominal depth " is not reported for tube or L member main material.

mem1 .short_depth returns the " Short side depth " that is reported in the local shape file for tube member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .SectionSize ( mem1.section_size ) = a string ("W18x40" or etc.) from the local shape file identifying the member main material.

Example 1: You Run the following script and select a beam. The script prints the " Section size " of that beam to the report viewer ( Output-Request Summary ):

# Prints the section size of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a non-misc member")
if mem1.Type != "Misc":
    print("The section size is: ", mem1.SectionSize)
else:
    print("Please select a non-miscellaneous member.")
ClearSelection()

Example 2: When you Run the following script and left-click ( Select ) a beam, mem1.Update() changes that beam's " Section size " to a W18x40.

 # Changes the section size of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a non-misc member")
if mem1.Type != "Misc":
    mem1.SectionSize = "W18x40"
    mem1.Update()
else:
    print("Please select a non-miscellaneous member.")
ClearSelection()

Example 3: This Python script opens a dialog that lets the user enter a different section size for each subsequently selected member. Press " Cancel " on the dialog ( Size = Prompt(size, "Section size:") ) to end the while loop ( break ). After the while loop ends, the selection is cleared ( ClearSelection() ), and the script ceases to run.

# While loop for changing section sizes of members. Press "Cancel" to end the operation.
from param import Prompt, ResponseNotOK, ClearSelection
from member import MemberLocate
default = "W18x40"
while default:
    try: 
        Size = Prompt(default, "Section size:")
    except ResponseNotOK:        # user presses "Cancel"
        break
    mem1 = MemberLocate("Select a member")
    mem1.SectionSize = Size
    mem1.Update()
    ClearSelection()

mem1 .FlangeThickness ( mem1.tf ) returns the " Flange thickness " that is reported in the local shape file for C or WT , ST , W or S member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .Thickness ( mem1.thick ) returns the " Material thickness " that is reported in the local shape file for L material, " Wall thickness " for pipe or tube material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .WebThickness ( mem1.tw ) returns the " Web thickness " that is reported in the local shape file for C or WT , ST , W or S member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .WeightPerFoot ( mem1.weight ) returns the " Weight per foot/meter " that is reported in the local shape file for C, L, pipe, WT, tube, W or joist member main material. ( read-only )

Angle main material attributes mem1 .AngleLegTurnedUp ( mem1.angle_leg_up ) returns "Yes" or "No" depending on whether the box is checked ("Yes") or not checked ("No") for " Angle leg turned up " on a vertical brace. ( read-only )

mem1 .Depth ( mem1.LL_depth ) returns the " Long leg depth " that is reported in the local shape file (for angle member main material). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

Example: var = mem1.LL_depth assigns to var the long leg depth of the main material of mem1

mem1 .LongLegOfAngleIsVertical ( mem1.LLV ) returns "Yes" or "No." When the " Long leg " is set to ' To gusset ', then ' Yes ' is returned. Only angle vertical braces with unequal legs can return "Yes." ( read-only )

mem1 .LongLegGage1 ( mem1.LL_gage ) returns the " Single column long leg gage " reported in the local shape file for L member main material with a single column of bolts on the long leg. ( read-only )

mem1 .LongLegGage2 ( mem1.LL_dbl_gage1 ) returns the " Double column long leg first gage " that is reported in the local shape file for L member main material with a double column of bolts on the long leg. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LongLegGage3 ( mem1.LL_dbl_gage2 ) returns the " Double column long leg second gage " that is reported in the local shape file for L member main material with a double column of bolts on the long leg. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .SL_depth returns the " Short leg depth " that is reported in the local shape file for the short leg of the angle member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .ShortLegGage1 ( mem1.SL_gage ) returns the " Single column long leg gage " that is reported in the local shape file for L member main material with a single column of bolts on the short leg. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .ShortLegGage2 ( mem1.SL_dbl_gage1 ) returns the " Double column short leg first gage " that is reported in the local shape file for L member main material with a double column of bolts on the short leg. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .ShortLegGage3 ( mem1.SL_dbl_gage2 ) returns the " Double column short leg second gage " that is reported in the local shape file for L member main material with a double column of bolts on the short leg. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

Status settings :

Setting dates : "now" or "today" enters the current date; "NOT SET" clears the date; "7/4/08" sets the date to be Jul 4 2008.

mem1 .RevisionLevel ( mem1.short_rev_desc ) = any " string " from the " Short Revision Description " column at Home > Project Settings > Job > Member Revisions . This attribute can write to or read from the " Short revision description " status in Member Status Review . ( Updatable )

# Updates the member's "Short revision description."
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
try:
    mem1.RevisionLevel = "CO-1"
    mem1.Update()
except SystemError:
    print("WARNING: CO-1 must be entered in setup")
ClearSelection()

mem1 .TypeDescription ( mem1.description ) = any " string " up to 22 characters. This attribute can write to or read from the " Member description " in Member Status Review . ( updatable b

 # Reads the "Member description" of the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Description is ", mem1.TypeDescription)
ClearSelection()
# Updates "Member description" for the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.TypeDescription = "CRANE RAIL"
mem1.Update()
ClearSelection()
# Updates "Member description" for multiple members.
from member import MultiMemberLocate
from param import Prompt, ResponseNotOK
mem_list = MultiMemberLocate("Select members")
try:
    desc = Prompt("CRANE RAIL", "Member description:")
    for each_mem in mem_list:
        each_mem.TypeDescription = desc
        each_mem.Update()
except ResponseNotOK:
    print("You have canceled this operation!")

mem1 .Category ( mem1.memb_category ) = any " string " from Member Categories in Fabricator Options . This attribute can write to or read from the " Member category " status in Member Status Review . ( Updatable)

# Updates "Member category" of the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
try:
    mem1.Category = "$XX.00/ft"
    mem1.Update()
except SystemError:
    print("WARNING: $XX.00/ft needs to be entered in setup!")
ClearSelection()
# Applies the category selected on the dialog to the selected member.
from member import MemberLocate
from param import ClearSelection
from dialog import Dialog
from dialog.combobox import Combobox
from fab import Fabricator
# dialog opens
dlg1 = Dialog( "Select a Member Category" )
Menu1 = Combobox( dlg1, "cat", (Fabricator().category_defs),
        label="Select a category:", default="Item 1"
        )
# dialog closes after user presses "OK" or "Cancel"
if dlg1.Run():      # if user pressed "OK"
    mem1 = MemberLocate("Select a member")
    mem1.Category = dlg1.cat
    mem1.Update()
    ClearSelection()
else:               # if user pressed "Cancel"
    print("You have canceled this operation.")

mem1 .IsExisting ( mem1.existing ) = "Yes" or "No". "Yes" = checked ( ). "No" = not checked ( ). This attribute can write to or read from the " Existing member " status in Member Status Review . ( updatable )

# Prints whether or not a member is existing.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("This member is existing: ", mem1.IsExisting)
ClearSelection()
# Makes the member that the user selects existing.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.IsExisting = "Yes"
mem1.Update()
ClearSelection()
# Makes ALL members in current Job NOT existing.
from member import MemberAllocated, Member
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        m.IsExisting = "No"
        m.Update()
    except:
        pass

mem1 .DateModelCompleted ( mem1.model_complete ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Model complete date " status of a member. Dates are returned as NOT SET or in the form Nov 7 2010 . ( Updatable )

# Reads "Model completed" of the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Model complete date is ", mem1.DateModelCompleted)
ClearSelection()
# Prints date selected members were marked Model Complete.
from member import MultiMemberLocate
mem_list = MultiMemberLocate("Select some members")
for each_mem in mem_list:
    if each_mem.DateModelCompleted != "NOT SET":
        print(each_mem.Piecemark, each_mem.DateModelCompleted)
# Updates "Model completed" for the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.DateModelCompleted = "11/7/10"
mem1.Update()
ClearSelection()
# Clears "Model completed" date of the user-selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.DateModelCompleted = "NOT SET"
mem1.Update()
ClearSelection()
# Clears "Model completed" for all members in Job.
from member import MemberAllocated, Member
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        m.DateModelCompleted = "NOT SET"
        m.Update()
    except:
        pass

mem1 .MarkedForHold ( mem1.hold_status ) = "Held" or "Not held". This attribute can write to or read from the " Member hold status " status in Member Status Review . ( Updatable )

# Prints the "Member hold status" of the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Hold status is:", mem1.MarkedForHold)
ClearSelection()
# Marks selected member as held, with option to continue.
from member import MemberLocate
from param import ClearSelection, yes_or_no
response = 1
while response == 1:
    mem1 = MemberLocate("Select a member")
    mem1.MarkedForHold = "Held"
    mem1.Update()
    response = yes_or_no("Mark another member as held?")
    print("You have ended this operation.")
    ClearSelection()
# Marks selected member as held, prints results.
from member import MemberLocate
mem1 = MemberLocate("Select a member")
print("Original status =", mem1.MarkedForHold)
mem1.MarkedForHold = "Held"
mem1.Update()
print("New status =", mem1.MarkedForHold)
ClearSelection()
# Prints all member numbers in model marked as held.
from member import MemberAllocated, Member
for mem_num in range(MemberAllocated() + 1):
    try:
        if Member(mem_num).MarkedForHold == "Held":
            print(Member(mem_num).MemberNumber,)
    except:
        pass

mem1 .DateMemberWasHeld ( mem1.held_date )= a date . Dates must be entered as string ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Date held " status in Member Status Review . Dates are returned as NOT SET or in the form Dec 25 2008 . ( Updatable )

Tip : If you are updating the member and want the hold date called out on the member detail, the member also needs to be set to "Held" and you need to Detail Members .
# Updates "Member hold status" and "Date held".
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.MarkedForHold = "Held"
mem1.DateMemberWasHeld = "today"
mem1.Update()
ClearSelection()

mem1 .DescriptionOfHold ( mem1.reason_held )= any " string " up to 29 characters. This attribute can write to or read from the " Reason for hold " status in Member Status Review . ( Updatable)

Tip : If you are updating the member and want to get the reason called out on the member detail, the member also needs to be set to "Held" and you need to Detail Members .
# Updates "Member hold status" and "Reason for hold."
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.MarkedForHold = "Held"
mem1.DescriptionOfHold = "transport not set."
mem1.Update()
ClearSelection()

mem1 .DateSentForApproval ( mem1.sent_appr ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Submitted for approval " status in Member Status Review . Dates are returned as NOT SET or in the form Dec 25 2008 . ( Updatable)

# Updates "Submitted for approval", prints results.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Original date =", mem1.DateSentForApproval)
mem1.DateSentForApproval = "12/25/08"
mem1.Update()
print("New date =", mem1.DateSentForApproval)
ClearSelection()
# "Submitted for approval" with option to continue.
from member import MemberLocate
from param import ClearSelection, yes_or_no
response = 1
while response == 1:
    mem1 = MemberLocate("Select a member")
    mem1.DateSentForApproval = "now"
    mem1.Update()
    response = yes_or_no("Set today as submit date on another?")
print("You have ended this operation.")
ClearSelection()
# Enters today's date to "Submitted for approval" for all members with the same mark as the one selected.
from member import MemberLocate, MemberAllocated, Member
from param import ClearSelection
mem1 = MemberLocate("Select a member")
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        if m.Piecemark == mem1.Piecemark:
            m.DateSentForApproval = "today"
            m.Update()
    except:
        pass
ClearSelection()

mem1 .DateReceivedApproval ( mem1.rcvd_appr ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Received from approval " status in Member Status Review . Dates are returned as NOT SET or in the form Jan 1 2009 . ( Updatable)

# Updates "Received from approval", prints before/after results.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Original date =", mem1.DateReceivedApproval)
mem1.DateReceivedApproval = "now"
mem1.Update()
print("New date =", mem1.DateReceivedApproval)
ClearSelection()
# Enters today's date to "Received from approval" for all members with the same mark as the one selected.
from member import MemberLocate, MemberAllocated, Member
from param import ClearSelection
mem1 = MemberLocate("Select a member")
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        if m.Piecemark == mem1.Piecemark:
            m.DateReceivedApproval = "now"
            m.Update()
    except:
        pass
ClearSelection()

mem1 .ApprovalStatus ( mem1.approval_status ) = "Approved" or "Rejected" or "Revise and resubmit" or "Approved as noted" or "Not reviewed". This attribute can write to or read from " Approval status " in Member Status Review . ( Updatable )

# Updates "Approval status", prints before & after results.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Original date =", mem1.ApprovalStatus)
mem1.ApprovalStatus = "Rejected"
mem1.Update()
print("New date =", mem1.ApprovalStatus)
ClearSelection()
# Clears "Approval status" for all members in Job.
from member import MemberAllocated, Member
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        m.ApprovalStatus         = "Not reviewed"
        m.Update()
    except:
        pass

mem1 .ProjectedDateToShop ( mem1.fab_projected ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Projected fabrication complete " status in Member Status Review . Dates are returned as NOT SET or in the form Feb 14 2009 . ( Updatable)

# Sets Jan 12, 2011 as projected fabrication complete on members selected usingMultiMemberLocate(), prints updated members.
from member import MultiMemberLocate
try:
    mem_list = MultiMemberLocate("Select some members")
    print("These [member numbers] have been updated:")
    for each_mem in mem_list:
        each_mem.ProjectedDateToShop = "1-12-11"
        each_mem.Update()
        print("[",each_mem.MemberNumber,"]",)
except SystemError:
    print("You canceled without selecting any members!")
# Enters current date to "Projected fabrication complete" for all members with the piecemark "B_8."
from member import MemberAllocated, Member
for mem_num in range(MemberAllocated() + 1):
try:
    m = Member(mem_num)
    if m.Piecemark == "B_8":
    m.ProjectedDateToShop = "today"
    m.Update()
except:
    pass

mem1 .ActualDateToShop ( mem1.fab_actual ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Released for fabrication " status in Member Status Review . Dates are returned as NOT SET or in the form Mar 21 2009 . ( Updatable )

# Updates members, one at a time, prints members affected.
from member import MemberLocate
from param import ClearSelection, yes_or_no
response = 1
mems_updated = [ ]
while response == 1:
    mem1 = MemberLocate("Select a member")
    mem1.ActualDateToShop = "4/21/11"
    mem1.Update()
    mems_updated.append(mem1)
    response = yes_or_no("Apply date to another member?")
for each_mem in mems_updated:
    print("Piecemark [num]:", each_mem.Piecemark, "[",each_mem.MemberNumber,"]")
ClearSelection()

mem1 .DateFabricationCompleted ( mem1.fab_complete ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Fabrication completed " status in Member Status Review . Dates are returned as NOT SET or in the form Jul 4 2009 . ( Updatable )

# Sets today as the fabrication completed date on members selected using MultiMemberLocate(), prints affected members.
from member import MultiMemberLocate
try:
    mem_list = MultiMemberLocate("Select some members")
    print("Member numbers of the members you selected:")
    for each_mem in mem_list:
        each_mem.DateFabricationCompleted = "today"
        each_mem.Update()
        print("[",each_mem.MemberNumber,"]",)
except SystemError:
    print("You canceled without selecting any members!")
# Enters Jul 4 2009 to "Projected fabrication complete" for all members with the same mark as the one selected.
from member import MemberLocate, MemberAllocated, Member
from param import ClearSelection
mem1 = MemberLocate("Select a member")
    for mem_num in range(MemberAllocated() + 1):
        try:
            m = Member(mem_num)
            if m.Piecemark == mem1.Piecemark:
                m.DateFabricationCompleted = "7 04 09"
                m.Update()
        except:
            pass
ClearSelection()

mem1 .ProjectedDateToShip ( mem1.ship_projected ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Projected shipped date " status in Member Status Review . Dates are returned in the form Oct 31 2009 . ( Updatable)

# Updates "Projected shipped date", prints results.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Original date =", mem1.ProjectedDateToShip)
mem1.ProjectedDateToShip = "10-31-09"
mem1.Update()
print("New date =", mem1.ProjectedDateToShip)
ClearSelection()

mem1 .ActualDateShipped ( mem1.ship_actual ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Actual ship date " status in Member Status Review . Dates are returned as NOT SET or in the form Jan 11 2011 . ( Updatable )

 # Updates members, one at a time, prints updated members.
from member import MemberLocate
from param import ClearSelection, yes_or_no
response = 1
mems_updated = [ ]
while response == 1:
    mem1 = MemberLocate("Select a member")
    mem1.ActualDateShipped = "1/11/11"
    mem1.Update()
    mems_updated.append(mem1)
    response = yes_or_no("Apply date to another member?")
    print("Member numbers of members you updated:")
    for each_mem in mems_updated:
        print("[",each_mem.MemberNumber,"]",)
ClearSelection()

mem1 .DateReceivedAtJobsite ( mem1.rcvd_jobsite ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Received on job site " status in Member Status Review . Dates are returned as NOT SET or in the form Dec 25 2009 . ( Updatable)

# Updates "Received at job site",
prints results.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("Original date =", mem1.DateReceivedAtJobsite)
mem1.DateReceivedAtJobsite = "Dec 25 2009"
mem1.Update()
print("New date =", mem1.DateReceivedAtJobsite)
ClearSelection()

mem1 .DateErected ( mem1.erected_date ) = a date . Dates must be entered as strings ("in quotes"). The date may be written in any form that SDS2 software conventionally accepts. This attribute can write to or read from the " Erected " status in Member Status Review . Dates are returned as NOT SET or in the form Jan 1 2010 . ( Updatable )

# Updates members, one at a time, prints members affected.
from member import MemberLocate
from param import ClearSelection, yes_or_no
response = 1
mems_updated = [ ]
while response == 1:
    mem1 = MemberLocate("Select a member")
    mem1.DateErected = "today"
    mem1.Update()
    mems_updated.append(mem1)
    response = yes_or_no("Apply date to another member?")
print("Member numbers of members you updated:")
for each_mem in mems_updated:
    print("[",each_mem.MemberNumber,"]",)
ClearSelection()
# Enters today's date to "Date erected" for all members with the same mark as the one selected.
from member import MemberLocate, MemberAllocated, Member
from param import ClearSelection
mem1 = MemberLocate("Select a member")
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        if m.Piecemark == mem1.Piecemark:
            m.DateErected = "today"
            m.Update()
    except:
        pass
ClearSelection()

mem1 .Route1Description ( mem1.memb_route1 ) = any " string " up to 39 characters that has been entered as a routing definition to the User Routing Category window for user routing configuration 1 . The routing definition must be entered as a string ("in quotes"). This attribute can write to or read from " Mult. Cutting " (or whatever the field in Member Status Review is named). Click here for more help. ( Updatable )

# Reads routing 1 of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("routing 1 is ", mem1.Route1Description)
ClearSelection()
# Updates routing 1 of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
try:
    mem1.Route1Description = "galvanized"
    mem1.Update()
except SystemError:
    print("WARNING: galvanized must be entered in setup!")
ClearSelection()
# Applies the selection on the dialog to the selected member.
from member import MemberLocate
from param import ClearSelection
from dialog import Dialog
from dialog.combobox import Combobox
from fab import Fabricator
# dialog opens
dlg1 = Dialog("Select a User Route 1 Definition")
Menu1 = Combobox(dlg1, 'xxx', Fabricator().user_route(Fabricator().user_route()[0]),
label="User Route 1:", default="Item 1")
# dialog closes after user presses "OK" or "Cancel"
if dlg1.Run():                          # if user presses "OK"
    mem1 = MemberLocate("Select a member")
    mem1.Route1Description = dlg1.xxx
    mem1.Update()
    ClearSelection()
else:                                    # if user presses "Cancel"
    print("You have canceled this operation.")

mem1 .Route2Description ( mem1.memb_route2 ) is the same as mem1.Route1Description , except that the " string " comes from user routing configuration 2 and writes to or reads from " Labor Code " (or whatever the field in Member Status Review is named). ( Updatable )

mem1 .Route3Description ( mem1.memb_route3 ) is the same as mem1.Route1Description , except that the " string " comes from user routing configuration 3 and writes to or reads from " Job Cost Code " (or whatever the field in Member Status Review is named). ( Updatable)

mem1 .Route4Description ( mem1.memb_route4 ) is the same as mem1.Route1Description , except that the " string " comes from user routing configuration 4 and writes to or reads from " Remarks " (or whatever the field in Member Status Review is named). ( Updatable)


Member attributes for beams :

mem1 .LeftEnd.WebDoublerPlate ( mem1.left.beam_web_doubler ) returns "Yes" or "No". ( read-only )

Also see: Search for Beam Web Doublers .

mem1 .CompositeBeamSlabSpacing ( mem1.slab_spacing ) returns the " Slab Width " entered for the beam on its edit window. ( read-only )

mem1 .RollingOperation ( mem1.roll_type ) = "None" or "Camber annotation" or "Weak axis" or "Strong axis" or "Camber" or "Camber (Both)". See " Rolling operation ." ( Updatable)

# Prints the "Rolling operation" of the beam you select.
from member import MemberLocate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a beam")
if mem1.Type == "Beam":
    print("Rolling operation is:", mem1.RollingOperation)
    if mem1.RollingOperation != "None":
        print("Mid-ordinate is:", mem1.MidOrdinate)
    print("Included angle is:", mem1.IncludedAngle)
    print("Rolling radius is:", mem1.RollingRadius)
else:
    print("Only beams can have rolling operations.")
ClearSelection()

mem1 .MidOrdinate ( mem1.mid_ordinate ) = a positive or negative (-) distance (a floating point number ) in mm or inches, depending on the startup code Units(' ... ') . The " Mid-ordinate " is the offset at mid-span of the beam's main material as a result of a " Rolling operation " of ' Camber ' or ' Camber (Both) ' or ' Strong axis ' or ' Weak axis ' or ' Camber annotation '. The sign (+ or -) sets the direction of offset. The beam is modeled and detailed straight if ' Camber annotation ' is the " Rolling operation ." ( Updatable)

# Updates the camber annotation on the beam you select.
from member import MemberLocate
from param import Units, ClearSelection
Units("feet")  # sets distances as decimal inches
mem1 = MemberLocate("Select a beam")
if mem1.Type == "Beam":
    mem1.RollingOperation = "Camber annotation"
    mem1.MidOrdinate = 2      # 2.0 inches because of units
    mem1.IncludedAngle = 0
    mem1.RollingRadius = 0
    mem1.Update()
else:
    print("Try again, but next time select a beam.") 
ClearSelection()

mem1 .IncludedAngle ( mem1.bend_angle ) = a positive or negative (-) number of degrees. This " Included angle " sets the curvature of the beam's main material as a result of a " Rolling operation " of ' Weak axis ' or ' Strong axis '. ( Updatable)

# Applies weak axis rolling to the beam you select.
from member import MemberLocate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select a beam")
if mem1.Type == "Beam":
    mem1.RollingOperation = "Weak axis"
    mem1.MidOrdinate = 0
    mem1.IncludedAngle = -45
    mem1.RollingRadius = 0
    mem1.Update()
else:
    print("You selected a", mem1.Type,"-- select a beam instead.")
ClearSelection()

mem1 .RollingRadius ( mem1.bend_radius ) = a positive or negative (-) distance (a floating point number ) in mm or inches, depending on the startup code Units(' ... ') . This " Rolling radius " is the distance that the beam's edge is from the center of the radius of bending as a result of a " Rolling operation " of ' Weak axis ' or ' Strong axis '. The smaller the " Rolling radius " (+ or -), the greater the curvature. ( Updatable)

# Applies weak axis rolling to the beam you select.
from member import MemberLocate
from param import Units, ClearSelection
Units("feet")
# sets distances to decimal inches
mem1 = MemberLocate("Select a beam")
if mem1.Type == "Beam":
    mem1.RollingOperation = "Weak axis"
    mem1.MidOrdinate = 0
    mem1.IncludedAngle = 0
    mem1.RollingRadius = -400.0        #
    inches because of units
    mem1.Update()
else:
    print("Next time read the prompt. Select a beam!")
ClearSelection()

Member attributes for columns :

Column attributes are documented in detail under Parametric Column Add .

Member attributes for braces :

Brace attributes are documented in detail under Parametric Vertical Brace Add or Parametric Horizontal Brace Add .

Member attributes for joists :

These attributes are read-only or not updatable . Other joist attributes are documented in detail under Parametric Joist Add .

mem1 .FlangeThickness ( mem1.BC_width ) returns the " Bottom chord width " reported in the local shape file . The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

# Prints bottom chord width of the joist the user selects.
from member import MemberLocate
from param import Units, ClearSelection
Units("feet") # sets output to decimal inches
mem1 = MemberLocate("Select a joist")
if mem1.Type == "Joist":
    print("Bottom chord width = ", mem1.BC_width)
else:
    print("Select a joist, not a" , mem1.Type)
ClearSelection()

mem1 .BearingDepth ( mem1.brg_depth ) returns the " Bearing depth " reported in the local shape file. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

# Prints the bearing depth of the joist you select.
from member import MemberLocate
from param import Units, ClearSelection
mem1 = MemberLocate("Select a joist")
Units("feet") # sets output to decimal inches
if mem1.Type == "Joist":
    print("Joist bearing depth is:",)
    mem1.BearingDepth
else:
    print("You selected a" ,mem1.Type, "not a joist")
ClearSelection()

mem1 .brg_thick returns the " Bearing thickness " reported in the local shape file. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .brg_width returns the " Bearing width " reported in the local shape file. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .TC_width returns the " Top chord width " reported in the local shape file. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .JoistTypeDescription ( mem1.series ) returns the " Material type " reported in the local shape file for the joist. ( read-only )

mem1 .max_brg returns the " Maximum bearing " reported in the local shape file. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .MinimumBearing ( mem1.min_brg ) returns the " Minimum bearing " reported in the local shape file. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )


Member attributes for stairs :

These attributes are read-only . You cannot create a Python script that adds stair members. These are general stair attributes only -- click here for LeftEnd/RightEnd stair attributes.

mem1 .WidthOfTread ( mem1.tread_width ) returns the " Width of tread " of the stair. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

# Prints the tread width of the stair you select.
from member import MemberLocate
from param import Units, ClearSelection
Units("feet") # sets output to decimal inches
mem1 = MemberLocate("Select a stair")
if mem1.Type == "Stair":
    print("Stair tread with is:",)
    mem1.WidthOfTread
else:
    print("You selected a", mem1.Type, "not a stair")
ClearSelection()

mem1 .CenterOffset ( mem1.cntr_offset_dim ) returns the stair's " Center offset dimension ". The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .MaterialDescription ( mem1.mtrl ) returns the " Material " (section size) used for the stringers. ( read-only )

mem1 .MaterialGrade ( mem1.grade ) returns the " Material grade " of the stringers. ( read-only )

mem1 .NumberOfRisers ( mem1.num_risers ) returns the " Number of risers " (an integer > 0) in the stair. ( read-only )

mem1 .ShopAssembled ( mem1.shop_assm ) returns "Yes" or "No" depending on whether or not the stair is " Shop assembled ." ( read-only )

mem1 .StringerNosing ( mem1.stringer_nosing_dim ) returns the " Stringer nosing dimension " of the stair. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .StringerSurfaceFinish ( mem1.stringer_finish ) returns "Sand Blasted" or "Red Oxide" or "Yellow Zinc" or "Gray Oxide" or "Blued Steel" or "Galvanized." ( read-only )

mem1 .ThicknessAtLanding ( mem1.landing_thick ) returns the " Bottom riser setback " of the stair. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .TreadSchedule ( mem1.tread_sched ) returns a stair tread object which has the attributes from Home > Project Settings > Fabricator > Stair Treads . See the documentation for the fab module. ( read-only )

mem1 .TreadSchedule.tread_type ( mem1.tread_sched ) returns "Bent plate" or "Bolted" or "Plate" or "Continuous" depending on whether the " Intermediate tread schedule " entered on the Stair Edit window is for pan treads or grating treads or plate treads or continuous treads . ( read-only )

mem1 .TreadSurfaceFinish ( mem1.tread_finish ) returns "Sand Blasted" or "Red Oxide" or "Yellow Zinc" or "Gray Oxide" or "Blued Steel" or "Galvanized". ( read-only )

(see below for LeftEnd/RightEnd stair attributes)


LeftEnd/RightEnd member end attributes :

Nodes

mem1 .LeftEnd.Nodes ( mem1.left.nodes ) returns a list [ ] of member numbers (the supporting members) that the end frames to. ( read-only )

Note: The list may include up to four member numbers. If the selected member frames to only one supporting member, that member's number is listed first followed by 0 for each of the other places that are indexed in the list. For example: [22, 0, 0, 0] lists member number 22 and no other members. The following example prints the list for the right end of the selected member.

# Prints member numbers the right end frames to.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print("The right nodes are ", mem1.RightEnd.Nodes)
ClearSelection()

Note how the if and for statements are used in the following example to extract information from the list that is returned for mem1.LeftEnd.nodes:

# Prints members (pcmk & [num]) supporting the left end of the member that the user selects.
from member import MemberLocate, Member
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print(mem1.Piecemark, "left-end nodes:", mem1.LeftEnd.Nodes)
print("Supporting members:")
for mem_num in mem1.LeftEnd.Nodes:
    if mem_num == 0:
        continue               # go to next node in list, see if it is zero
    mem2 = Member(mem_num)
    print(mem2.Piecemark, "[",mem2.MemberNumber,"]")
ClearSelection()

LeftEnd/RightEnd end cuts mem1 .LeftEnd.AngleOfWebEndCut ( mem.left.web_cut_angle ) = a positive or negative (-) number of degrees. This the left end cut angle (in degrees) for a bevel cut member. For a beam, column, vertical brace, horizontal brace, girt or purlin, this updates to " Web cut " on the member edit window. ( Updatable)

mem1 .LeftEnd.AngleOfFlangeEndCut ( mem.left.flange_cut_angle ) = a positive or negative (-) number of degrees. This the left end flange cut angle for a member. For a beam, column, vertical brace, horizontal brace, girt or purlin, this is updates to " Flange cut " on the member edit window. ( Updatable)

mem1 .LeftEnd.EndPreparation ( mem.left.end_cut ) = "Mill Cut" or "Square Cut" or "Standard Cut" or "Bevel Cut." For a beam, column, vertical brace, horizontal brace, girt or purlin, this updates to " End-cut type " on the Rolled Section Material window that is associated with the main material of that member. ( Updatable)

LeftEnd/RightEnd setbacks mem1 .LeftEnd.ConnectionSetbackFlag ( mem.left.auto_conn_setback ) = "Yes" or "No". "Yes" selects the radio button for " Connection setback " on the member edit window so that you can update the mem1.LeftEnd.ConnectionSetback . ( Updatable)

LeftEnd/RightEnd.ConnectionSetback updates:
beam " Connection setback "
girt (legacy) " Connection setback "
purlin " Connection setback "

mem1 .LeftEnd.ConnectionSetback ( mem.left.conn_setback ) = the distance from the face of the connection to the member main material. The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( updatable)

LeftEnd/RightEnd.ConnectionSetback updates:
beam " Connection setback "
girt (legacy) " Connection setback "
purlin " Connection setback "

mem1 .LeftEnd.AutoMaterialSetback ( mem.left.auto_setback ) = "Yes" or "No". ( Updatable)

LeftEnd/RightEnd.AutoMaterialSetback updates:
beam " Automatic material setback "
girt (legacy) " Automatic material setback "
purlin " Automatic material setback "

mem1 .LeftEnd.MaterialSetback ( mem.left.setback ) = the distance from the end of the member main material to the work point. A distance is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( updatable)

LeftEnd/RightEnd.MaterialSetback updates:
beam " Input material setback "
girt (legacy) " Input material setback "
purlin " Input material setback "

mem1 .LeftEnd.FieldClearanceFlag ( mem.left.auto_field_clear ) = "Yes" or "No". "Yes" selects the radio button for " Field clearance " on the member edit window so that you can update the mem1.LeftEnd.FieldClearance .

LeftEnd/RightEnd.FieldClearanceFlag updates:
beam " Field clearance "
horizontal brace " Field clearance "
vertical brace " Field clearance "
girt (legacy) " Field clearance "
purlin " Field clearance "

mem1 .LeftEnd.FieldClearance ( mem.left.field_clear ) = the distance from the end of the main material (or the connection material) to the face of the supporting member. A distance is a floating point number in mm or inches, depending on the startup code Units(' ... ') . In the case of a brace with a clip angle to the supporting member, the field clearance is measured to the clip angle. ( Updatable)

LeftEnd/RightEnd.FieldClearance updates:
beam " Field clearance "
horizontal brace " Field clearance "
vertical brace " Field clearance "
girt (legacy) " Field clearance "
purlin " Field clearance "

mem1 .LeftEnd.AutoMinusDimension ( mem.left.auto_minus_dim ) = "Yes" or "No". ( Updatable)

LeftEnd/RightEnd.AutoMinusDimension updates:
beam " Automatic minus dimension "
horizontal brace " Automatic minus dimension "
vertical brace " Automatic minus dimension "
girt (legacy) " Automatic minus dimension "
purlin " Automatic minus dimension "

mem1 .LeftEnd.MinusDimension ( mem.left.minus_dim ) = the distance from the main material (or connection material) to the member's left-end work point. A distance is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( updatable)

LeftEnd/RightEnd.AutoMinusDimension updates:
beam " Input minus dimension "
horizontal brace " Input minus dimension "
vertical brace " Input minus dimension "
girt " Input minus dimension "
purlin " Input minus dimension "

mem1 .LeftEnd.OffsetFramingDistanceToWorkpoint ( mem.left.offset_dim ) is used to calculate mem1.MaterialDetailLength from mem1.WorkpointToWorkpointSlope. ( not updatable )

LeftEnd/RightEnd loads mem1 .LeftEnd.AutoCompressionLoadCalculation ( mem.left.auto_compression ) = "Yes" or "No". "Yes" checks the box for Auto ( ) " Compression load " on the horizontal or vertical brace edit window. "No" unchecks the box for Auto " Compression load " ( ). When updating a brace's compression load, Auto should be unchecked. ( Updatable)

LeftEnd/RightEnd.AutoCompressionLoadCalculation updates:
horizontal brace " Compression load "
vertical brace " Compression load "

mem1 .LeftEnd.CompressionLoad ( mem.left.compression ) = compression in kips or kN. When updating a brace's compression load, Auto must be unchecked ( ) to have the load applied. ( Updatable)

LeftEnd/RightEnd.CompressionLoad updates:
beam " Compression load "
horizontal brace " Compression load "
vertical brace " Compression load "
# Applies right-end compression and processes.
from member import MemberLocate
from job import ProcessOneMem
from param import ClearSelection
mem1 = MemberLocate("Select a member")
if mem1.Type in ["Beam", "Vertical Brace", "Horizontal Brc"]:
    mem1.RightEnd.CompressionLoad = 60.0
    mem1.RightEnd.AutoCompressionLoadCalculation = "No"
    mem1.Update()
    ProcessOneMem(mem1.MemberNumber)
else:
    print("You selected a", mem1.Type)
    print("You need to select a beam or brace!")
ClearSelection()

mem1 .LeftEnd.AutoMomentLoad ( mem.left.auto_moment ) = "Yes" or "No". "Yes" checks the box for Auto ( ) " Moment ... " on the beam or column edit window. "No" unchecks the box for Auto " Moment ... " ( ). When updating a member's moment, Auto should be unchecked. ( Updatable)

LeftEnd/RightEnd.AutoMomentLoad updates:
beam " Moment load "
column " Moment "

mem1 .LeftEnd.MomentForce ( mem.left.moment ) = the moment load in kip-in or kN-m. When updating a beam or column's moment load, Auto must be unchecked ( ) to have the load applied. ( Updatable)

LeftEnd/RightEnd.MomentForce updates:
beam " Moment load "
column " Moment "

mem1 .LeftEnd.AutoShearLoad ( mem.left.auto_shear ) = "Yes" or "No". "Yes" checks the box for Auto ( ) on the beam or column or joist edit window. "No" unchecks the box for Auto ( ). When updating a member's shear load, Auto should be unchecked. ( updatable)

LeftEnd/RightEnd.AutoShearLoad updates:
beam " Shear load "
column " Horizontal shear "
joist " Load "

mem1 .LeftEnd.ShearLoad ( mem.left.shear ) = shear in kips or kN. When updating a members's shear load, Auto must be unchecked ( ) to have the load applied. ( updatable)

LeftEnd/RightEnd.ShearLoad updates:
beam " Shear load "
column " Horizontal shear "
joist " Load "

mem1 .LeftEnd.AutoTensionLoadCalculation ( mem.left.auto_tension ) = "Yes" or "No". "Yes" checks the box for Auto ( ) on the member edit window. "No" unchecks the box for Auto ( ). When updating a member's tension load, Auto should be unchecked. ( Updatable)

LeftEnd/RightEnd.AutoTensionLoadCalculation updates:
horizontal brace " Tension load "
vertical brace " Tension load "

mem1 .LeftEnd.TensionLoad ( mem.left.tension ) = tension in kips or kN. When updating a members's tension load, Auto must be unchecked ( ) to have the load applied. ( updatable)

LeftEnd/RightEnd.TensionLoad updates:
beam " Tension load "
horizontal brace " Tension load "
vertical brace " Tension load "
# Applies right-end tension, processes.
from member import MemberLocate
from job import ProcessOneMem
from param import ClearSelection
mem1 = MemberLocate("Select a member")
if mem1.Type in ["Beam", "Vertical Brace", "Horizontal Brc"]:
    mem1.RightEnd.TensionLoad = 60.0
    mem1.RightEnd.AutoTensionLoadCalculation = "No"
    mem1.Update()
    ProcessOneMem(mem1.MemberNumber)
else:
    print("You selected a", mem1.Type)
    print("You need to select a beam or brace!")
ClearSelection()

LeftEnd/RightEnd stair attributes

Note: The following examples of left end stair attributes are for the near side stringer. For a far side stringer, substitute "FarSide" for "NearSide" in the attribute string. Also, you can substitute ".RightEnd" for ".LeftEnd" to get right-end equivalents.

mem1 .LeftEnd.NearSideEndCondition ( mem.left.ns_end_cond ) returns "No return" or "Return" or "Bolt to floor" depending on the selection made to " End condition " (in the following example, for the right end of the near side stringer). ( read-only )

# Prints the right end, NS support condition of the stair you select.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a stair")
if mem1.Type == "Stair":
    print("Right end, NS:", mem1.RightEnd.NearSideEndCondition)
else:
    print("You selected a member type other than a stair.")
ClearSelection()

mem1 .LeftEnd.NearSideCopeDepthTop ( mem.left.ns_cope_depth_top ) returns the " Cope depth top " on the stair's edit window (in this example, for the left end of the near side stringer). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LeftEnd.NearSideCopeLengthTop ( mem.left.ns_cope_len_top ) returns " Cope length,h top " on the stair's edit window (in this example, for the left end of the near side stringer). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LeftEnd.NearSideCopeDepthBottom ( mem.left.ns_cope_depth_bot ) returns the " Cope depth bottom " (a floating point number in the startup code " Units ") on the stair's edit window (in this example, for the left end of the near side stringer). ( read-only )

mem1 .LeftEnd.NearSideCopeLengthBottom ( mem.left.ns_cope_len_bot ) returns the " Cope length,h bottom " on the stair's edit window (in this example, for the left end of the near side stringer). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LeftEnd.NearSideCapPlateThickness ( mem.left.ns_cap_pl_thick ) returns the " Cap plate thickness " on the stair's edit window (in this example, for the left end of the near side stringer). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LeftEnd.NearSideSupportToWorkpoint ( mem.left.ns_supp_to_wkpt ) returns the " Support to work point " on the stair's edit window (in this example, for the left end of the near side stringer). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LeftEnd.NearSideSlabToTopReturn ( mem.left.ns_slab_to_top_rtn ) returns the " Slab to top return " on the stair's edit window (in this example, for the left end of the near side stringer). The returned value is a floating point number in mm or inches, depending on the startup code Units(' ... ') . ( read-only )

mem1 .LeftEnd.NearSideReturnLocation ( mem.left.ns_rtn_location ) returns the global coordinates of the farthest point on the top of the return (in this example, the far left point at the top of the near side return). ( read-only )

Other LeftEnd/RightEnd member attributes mem1 .LeftEnd.DihedralAngle ( mem.left.dihedral ) returns the angle of the member to the supporting member. ( read-only )

mem1 .LeftEnd.Rotation ( mem.left.rotation ) returns a positive or negative (-) number of degrees from vertical. ( read-only )


Member methods and functions :

MemberAllocated() returns the number ( integer > 31) of members allocated in your current Job.

# Clears Model completed for all members in Job.
from member import MemberAllocated, Member
for mem_num in range(MemberAllocated() + 1):
    try:
        m = Member(mem_num)
        m.DateModelCompleted = "NOT SET"
        m.Update()
    except:
        pass

MarkMemberForProcess(obj) marks the member ( obj ) for Process and Create Solids , where obj is a member object or a member number.

 # Updates member description and marks it for process.
from member import MemberLocate, MarkMemberForProcess
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mem1.TypeDescription = "CRANE RAIL"
mem1.Update()
MarkMemberForProcess(mem1)
ClearSelection()
# Updates descriptions, marks members, processes
from member import *
from job import ProcessJob
mem_list = MultiMemberLocate("Select some members")
for each_mem in mem_list:
    each_mem.TypeDescription = "CRANE RAIL"
    each_mem.Update()
MarkMemberForProcess(each_mem)
ProcessJob()

Note: When you memadd1.Add() a parametric beam, column, brace or etc., the member is automatically marked for Process and Create Solids . You therefore do not have to use MarkMemberForProcess() for such members. SDS2 software also automatically marks affected members for Process and Create Solids when you update most attributes using mem1.Update() . Updating some attributes, such as status attributes, do not cause the affected member to be marked for process. Also, doing a MemberPropertySet(mem_obj, "field", "setting") does not automatically mark the affected member for process.

memadd1 .Add() adds the parametric member whose attributes are defined in the code.

mem1 .Update() ( mem1.update() ) updates the member object ( mem1 ) with the attributes assigned to that object in the code. The member is automatically marked for processing.

Example 1: When you Run the following script and left-click ( Select ) a beam, the program changes that beam's " Section size " to a W18x40.

# Enters a new section size to the selected member.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a non-miscellaneous member")
if mem1.Type != "Misc":
    mem1.SectionSize = "W18x40"
    mem1.Update()
else:
    print("Please select a non-miscellaneous member.")
ClearSelection()

Example 2: Here's a script that lets you enter different section sizes for multiple members. Press " Cancel " on the dialog ( Size = Prompt(size, "Section size:") ) to end the while loop ( break ) and stop the script from running.

# While loop for changing section sizes of members.
from member import MemberLocate
from param import Prompt, ClearSelection, ResponseNotOK
size = "W18x40"
while size != ResponseNotOK:
    try:
        size = Prompt(size, "Section size:")
    except ResponseNotOK:
        ClearSelection()
        break
    mem1 = MemberLocate("Select a member")
    mem1.SectionSize = Size
    mem1.Update()

Also see: To update custom properties, use MemberPropertySet(mem_obj, "field", "setting") .

mem1 .Material(i) ( mem1.material(i) ) returns a material object for the i'th material on the member. The following script outputs the material type of each material associated with the selected member. The first material printed is the member main material.

# Prints material types of each submaterial of a member.
from member import MemberLocate
from param import ClearSelection
import mtrl_list      # access to error
mem1 = MemberLocate( "Select any member" )
print("Member ", mem1.piecemark)
ii = 0
while 1:
    try:
        mem_mtrl = mem1.material(ii)
    except mtrl_list.error:
        # no more material
        break
    print("Material type", mem_mtrl.mtrl_type)
    # next material
    ii += 1
ClearSelection()

mem1 .Shape() ( mem1.shape() ) returns a shape object. See shape attributes .

Example: You access the Parametric Rectangular Plate Material window while Recording a Rectangular Plate Add operation. The " Object name " listed on this window is rp1 . The " Member " is therefore rpl.Member . To " Material thickness " on that window you enter rp1.Member.FlangeThickness to designate that the material thickness of the rectangular plate be equal to the flange thickness of whatever section size is assigned to rp1.Member The resulting line of parametric code reads: rp1.Thickness = rp1.Member.FlangeThickness

mem1 .TranslateToGlobal(dx, dy, dz) ( mem1.trans_to_global(dx, dy, dz) ) returns global coordinate distances, where dx, dy, dz are member local coordinate distances.

Example 1: If obj.Member.LeftEnd.Location is 0,0,0 in the global coordinate system, then X = obj.Member.LeftEnd.Location + rp1.Member.TranslateToGlobal(100.0, -20.0, 3.0) returns (100.0, -20.0, 3.0) in global coordinates. If obj.Member is a horizontal beam, the point is placed 100.0 units (mm or inches) away from the left end of the beam and toward the right end of the beam, 20.0 units below the top flange of the beam, and 3.0 units toward the near side of the beam (toward you if you are looking at the near side).

Example 2: If obj.Member.RightEnd.Location is the right work point of a perfectly vertical column, then X = obj.Member.RightEnd.Location + rp1.Member.TranslateToGlobal(-100.0, 20.0, 2.0) places the work point 100.0 units (mm or inches) below the top of the column, 20.0 units away from the half-depth of the column toward what would be the top flange if the column were laid so you were looking at its near side with its top end to your right and its bottom end to your left, and 2.0 units toward the near side of the column (toward you if you are looking at the near side).

mem1 .TranslateToLocal(arg1) ( mem1.trans_to_local(arg1) ) returns member coordinates , where arg1 is a tuple or point defined by global coordinates . Essentially this function does the opposite of mem1.Translate(dx, dy, dz) . The following script prints the distance along member's x-axis that the selected point resides from the selected member's right end location.

# Prints distance between point and member's right wkpt.
from point import PointLocate
from member import MemberLocate
from param import ClearSelection
# my_pt must be on member's workline
my_pt = PointLocate("Locate a point")   # use INCM
bm1 = MemberLocate("Select a member")
pt_delta_global = my_pt - bm1.RightEnd.Location
pt_delta_bm1 = bm1.TranslateToLocal(pt_delta_global)
print(pt_delta_bm1.X)
ClearSelection()

mem1 .MainMaterial() ( mem1.main_mtrl() ) returns the main material of a member as a material object.

# Prints the steel grade of the member the user selects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
mtrl = mem1.MainMaterial()
print(mtrl.MaterialGrade)
ClearSelection()

mem1 .MainMaterials() ( mem1.main_materials ) returns a list of generic material objects that are the member object's (mem1's) main materials. Most members have only one main material. Stairs and double-angle braces have two main materials.

# Prints a list of generic material objects.
from member import MemberLocate
from param import ClearSelection
mem1 = MemberLocate("Select a member")
print(mem1.MainMaterials())
ClearSelection()

mem1 .MainMaterial().Erase() ( mem1.main_mtrl().erase() ) deletes member main material. The following example inserts a yes_or_no() function that brings up an OK-Cancel dialog to allow the user to cancel the deletion of the member main material.

# Erases the main material of the member the user selects.
from member import MemberLocate
from param import ClearSelection, yes_or_no, Warning
mem1 = MemberLocate("Select a member")
var = yes_or_no("Main material will be erased!")
if var == 1:           # if user presses "Yes"
    mem1.MainMaterial().Erase()
else:                  # if user presses "No"
Warning("You have canceled this operation")
ClearSelection()

GroupMemberCreate(mem_list, main_mem, "Yes") creates a group member. The first argument (mem_list, ..., ...) is a list of member objects or member numbers. The second argument (..., main_mem, ...) is a member object or member number that sets the " Main member ." The third argument (..., ..., "Yes") is optional; it emits a yes-no warning in the event that the script attempts to group a member that is already a part of a group member.

The list of member objects ( mem_list ) can be created using MultiMemberLocate("prompt string") :

# Creates a group member from selected members.
from member import *
from param import ClearSelection
mem_list = MultiMemberLocate("Select members")
main_mem = MemberLocate("Select the main member")
GroupMemberCreate(mem_list, main_mem)
ClearSelection()

You can also create your own list of member numbers:

 # Creates a group member from member numbers in list.
from member import GroupMemberCreate
mem_list = [7, 14, 21]
GroupMemberCreate(mem_list, [0])
# [0] returns 7, the first member in the list

This example shows another way of creating a list that is a mixture of member objects and member numbers:

# Creates a group member from a list of selected members.
from member import MemberLocate, GroupMemberCreate
from param import ClearSelection
ClearSelection()
mem1 = MemberLocate("Select the main member")
mem2 = MemberLocate("Select 2nd member")
mem3 = MemberLocate("Select 3rd member")
mem4 = MemberLocate("Select 4th member")
mem_list = []
mem_list.append(mem1)
mem_list.append(mem2.MemberNumber)
mem_list.append(mem3)
mem_list.append(mem4.MemberNumber)
GroupMemberCreate(mem_list, mem1)
ClearSelection()