Back to SDS/2 Parametric Scripts

## Beam_WebOpng.py Version 1.00

"""

Cut rectangular openings in the web of beam

"""

def run_script():

    # startup code begin

    from macrolib.FileDefaults import import_data, export_data  # macrolib.pickle required

    from macrolib.MemCnt import member_count

    from macrolib.angle import rtod, dtor

    from macrolib.ExceptWarn import formatExceptionInfo

 

    import sys, os

    from math import tan, atan2, sin, cos, asin

 

    from param import yes_or_no, ResponseNotOK, Units, ClearSelection, Dialog, dim_print, Warning, dim

    from mtrl_list import MtrlLocate

    from point import Point, PointLocate

    from mtrl_cut import MtrlCut

    from shape import Shape

 

    Units("feet")

    # startup code end

    #######################################################

    ## Variables section

    # system path for defaults file

    default_file_path = os.path.join(os.getcwd(), "macro", "Defaults")

    # defaults file

    def_file = "MtrlWebOpng.txt"

    # default to enable or disable the importing and exporting of dialog dictionary variables "Enable" "Disable"

    enable_default_import_export = "Enable"

 

    image_path = os.path.join(os.getcwd(), "macro", "Images")

    image_name = os.path.join(image_path, "MtrlWebOpng.gif")

 

    ## Defaults section

    opng_length = 10.0

    opng_height = 4.0

    # distance from top of material to top of opening

    opng_vert_dist = 1.0

    opng_rad = 0.5

    #######################################################

    def opng_cut(mtrl, ptList, rad=0.0, rot=(0,0,0)):

        # try:

        # mtrl cut begin

        mcut1 = MtrlCut()

        mcut1.mtrl = [mtrl, ]

        mcut1.rotate = rot

        for pt in ptList:

            mcut1.pts.append((pt, rad))

        mcut1.cut("Layout")

        return True

        """

        except:

            Warning(formatExceptionInfo())

            return False

        """

        # mtrl cut end

 

    ###########################################################

    ## import defaults data if enabled

    if enable_default_import_export == "Enable":

        dd0 = import_data(os.path.join(default_file_path, def_file))

        if dd0:

            for key, value in dd0.items():

                exec "%s = %s" % (key, repr(value)) in None

    ###########################################################       

 

    ## Main Program Loop

    while True:

        ClearSelection()

        z = 1

        bm_list = []

       

        while z:

            mem1 = MemberLocate("Select BEAM Member")

            if mem1 == None:

                break

            else:

                if mem1.type in ["Beam", ]:

                    if mem1.mtrl_type in ["W flange", "Channel", "Angle", "Pipe", "W Tee", "Tube"]:

                        z = 0           # Limit selection to one member

                        bm_list.append(mem1)

                    else:

                        Warning("%s material is not supported." % (mem1.mtrl_type))

                else:

                    Warning("You picked a %s. You must pick a Beam." % (mem1.type))

 

        if len(bm_list) < 1:

            break

       

        chk_mem_list = member_count(bm_list[0])

       

        if len(chk_mem_list) > 1:

            if yes_or_no("Add flange preparations to all members with the same piecemark \r(%s members with mark %s)" % (len(chk_mem_list), mem1.piecemark)) == 1:

                bm_list = chk_mem_list

               

        #################################################################

        ##  Dialog Box 1

        dlg1 = Dialog( "Beam web openings" )

        dlg1.menu("print_doc", ("Yes", "No"), "No", "Print documentation only                       ")

        dlg1.tabset_begin()

       

        dlg1.tab("Opening dimensions")

        dlg1.group_title("Dimensions")

        dlg1.entry("opng_length", dim_print(opng_length), "Opening length                   ")

        dlg1.entry("opng_height", dim_print(opng_height), "Opening height")

        dlg1.entry("opng_rad", dim_print(opng_rad), "Opening corner radius")

        dlg1.entry("opng_vert_dist", dim_print(opng_vert_dist), "Distance to top of opening")

        dlg1.group_title_end

       

        dlg1.tab("Graphic Image")

        dlg1.image(image_name)

        try:

            dd1 = dlg1.done()

        except ResponseNotOK:

            break

 

        # Update the local namespace

        for key, value in dd1.items():

            exec "%s = %s" % (key, repr(value)) in None

           

        ###############################################################

        ## END DIALOG BOX 1 ------------------------------------------#

        ###############################################################

        if print_doc == "Yes":

            print __doc__

           

        # Export defaults to disk if enabled

        if enable_default_import_export == "Enable":

            export_data(os.path.join(default_file_path, def_file), dd1)

 

        pt_list = []

        while True:

            ptWP = PointLocate('Select center of opening point')

            if ptWP is None:

                break

            pt_list.append(ptWP)

       

        pt_list_loc = []

        for pt in pt_list:

            pt_list_loc.append(Point((mem1.trans_to_local(pt-mem1.left.location)).x, -opng_vert_dist, 0.0))

                   

        for bm in bm_list:

            for pt in pt_list_loc:

                ptWP = bm.left.location + bm.translate(pt)

                pt1 = ptWP + bm.translate(opng_length/2, 0.0, 0.0)

                pt2 = pt1 + bm.translate(0.0, -opng_height, 0.0)

                pt3 = pt2 + bm.translate(-opng_length, 0.0, 0.0)

                pt4 = pt3 + bm.translate(0.0, opng_height, 0.0)

                opng_cut(bm.main_mtrl(), [ptWP, pt1, pt2, pt3, pt4, ptWP], opng_rad)

 

        if not yes_or_no("Cut openings in more beams?"):

            break

       

## end run_script() #########################################################

if __name__ == '__main__':

    try:

        run_script()

    finally:

        del run_script