Transaction not closed - warning in Revit

Hello Folks,

I would be glad if i can be assisted with this challenge. All looks perfect to me, but i get his error after running. “A transaction or sub-transaction was opened but not closed. All changes to the active document made by External Command will be discarded.”

Heres the code below:

import Autodesk

from Autodesk.Revit.DB import *

from Autodesk.Revit.UI import *

from curveactions import beam_vector

from curveactions import maxminPoint

# Get active user document, selection and views

doc = __revit__.ActiveUIDocument.Document

uidoc = __revit__.ActiveUIDocument

sel = uidoc.Selection.PickObjects(Selection.ObjectType.Element, 'Choose elements')

views = FilteredElementCollector(doc).OfClass(View).ToElements()

# Get relevant view template

for view in views:

    if view.IsTemplate == True:

        if view.Name == "RCL - Beam Elevation View":

            viewTemplate = view.Id

# List of selected beams

chosen_beams = [doc.GetElement(elId) for elId in sel]

# extension of min and max of boundingbox

endTrans = XYZ(-0.6, -0.15, 0.9)

startTrans = XYZ(0.6, 0.15, -0.3)

# Get curves and vectors from beams

Curves = beam_vector(chosen_beams)[2]

CurvesVector = beam_vector(chosen_beams)[3]

#Get maximum and minimum point from selected beams

minPoint = (maxminPoint(Curves, CurvesVector)[0]) + endTrans

maxPoint = (maxminPoint(Curves, CurvesVector)[1]) + startTrans

#Create new boundingbox from max n min points

newBB = BoundingBoxXYZ()

newBB.Min = minPoint

newBB.Max = maxPoint

#Create section

t = Transaction(doc, 'Create Section')

t.Start()

beamsection = CreateSection(doc, viewTemplate, newBB)

t.Commit()

Thank you.

Could you post these two functions so the script can be tested?

def beam_vector(selected_beams):

    beam_vectors = []

    beam_curves = []

    focus_curves = []

    focus_curves_vectors = []

    for beam in selected_beams:

        focus_curve = beam.Location.Curve

        focus_start_point = focus_curve.GetEndPoint(0)

        focus_end_point = focus_curve.GetEndPoint(1)

        focus_beam_vector = (focus_start_point - focus_end_point).Normalize()

        # focus_beam_vector_str = focus_beam_vector.ToString()

        

        beam_vectors.append(focus_beam_vector)

        beam_curves.append(focus_curve)

    for curvector, curve in zip(beam_vectors, beam_curves):

        if round(curvector.X) < 0 or round(curvector.Y) < 0:

            reversed_curve = curve.CreateReversed()

            focus_curves.append(reversed_curve)

        else:

            focus_curves.append(curve)

    

    for focCurve in focus_curves:

        focCurveVector = (focCurve.GetEndPoint(0) - focCurve.GetEndPoint(1)).Normalize()

        focus_curves_vectors.append(focCurveVector)

    

    return beam_vectors, beam_curves, focus_curves, focus_curves_vectors

def curve_vector(selected_curves):

    curVectors = []

    for curve in selected_curves:

        curve_start_point = curve.GetEndPoint(0)

        curve_end_point = curve.GetEndPoint(1)

        cur_vector = (curve_start_point - curve_end_point).Normalize()

        curVectors.append(cur_vector)

    return curVectors

def maxminPoint(reversedCurves, reversedCurvesVector):

    curveStartPointsX = []

    curveStartPointsY = []

    curveEndPointsX = []

    curveEndPointsY = []

    curStartPoints = []

    curEndPoints = []

    dictXst = {}

    dictXnd = {}

    dictYst = {}

    dictYnd = {}

    for revcurve in reversedCurves:

        curStartPoints.append(revcurve.GetEndPoint(0))

        curEndPoints.append(revcurve.GetEndPoint(1))

        curveStartPointsX.append(revcurve.GetEndPoint(0).X)

        curveStartPointsY.append(revcurve.GetEndPoint(0).Y)

        curveEndPointsX.append(revcurve.GetEndPoint(1).X)

        curveEndPointsY.append(revcurve.GetEndPoint(1).Y)

    for revcurvector in reversedCurvesVector:

    

        if revcurvector.X == 1.0:

        

            for key,value in zip(curveStartPointsX, curStartPoints):

                if key in dictXst:

                    dictXst[key].append(value)

                #print(dictX[key])

                else:

                    dictXst[key] = [value]

    

            #print(dictX)

                dictXst_keys = (list(dictXst.keys()))

                minkeyX = max(dictXst_keys)            

                minimumPoint = dictXst[minkeyX][0] 

              

            for key,value in zip(curveEndPointsX, curEndPoints):

                if key in dictXnd:

                    dictXnd[key].append(value)

                #print(dictX[key])

                else:

                    dictXnd[key] = [value]

                dictXnd_keys = (list(dictXnd.keys()))

            

                maxkeyX = min(dictXnd_keys)

                maximumPoint = dictXnd[maxkeyX][0] 

            

        elif revcurvector.Y == 1.0:

        

            for key,value in zip(curveStartPointsY, curStartPoints):

                if key in dictYst:

                    dictYst[key].append(value)

                #print(dictX[key])

                else:

                    dictYst[key] = [value]

                dictYst_keys = (list(dictYst.keys()))

            

                minkeyY = max(dictYst_keys)   

                     

                minimumPoint = (dictYst[minkeyY][0]) 

            for key,value in zip(curveEndPointsY, curEndPoints):

                if key in dictYnd:

                    dictYnd[key].append(value)

                #print(dictY[key])

                else:

                    dictYnd[key] = [value]

                dictYnd_keys = (list(dictYnd.keys()))

            

                maxkeyY = min(dictYnd_keys)

                maximumPoint = dictYnd[maxkeyY][0]

    return minimumPoint, maximumPoint

It looks like it is failing due to your section box.
Also, include ViewSection:
beamsection = ViewSection.CreateSection(doc, viewTemplate, newBB)

Take a look at this for creating a sectionbox: