Getting an AttributeError from a simple Example Code

I’ve been trying for days to get the start and endpoint from a line/curve in Python so that I can work with it. Now I suspect it has something to do with the installation of Dynamo, Python, or a problem with clr.AddReference('ProtoGeometry'). How can I test it, or does someone have a better suggestion? Thanks and best regards, Igor.

1 Like

@ib9YMLD ,

the key is you need geometry…

import sys
import clr

clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference("ProtoGeometry")
from Autodesk.DesignScript import *


doc = DocumentManager.Instance.CurrentDBDocument
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

# 🛒🛒 collect
detailLines = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Lines).WhereElementIsNotElementType().ToElements()

# 🎲 geometry
_lines = [ i.Location.Curve.ToProtoType() for i in detailLines]

# 🔴🟠🟡points
startPoints = [i.StartPoint for i in _lines]
endPoints = [i.EndPoint for i in _lines]


OUT =  startPoints, endPoints
3 Likes

Hi,

I could be wrong, but I think it has something to do with a wrong ChatGPT response. :slightly_smiling_face:

5 Likes

@c.poupin ,

i used my brain and a snippet from clockwork :wink:

@Draxl_Andreas

I was talking about the initial code (not yours) :wink:

image

2 Likes

Hi

# Load the Python Standard and DesignScript Libraries
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

#Input variable of "Lines"
lines = IN[0]

#First we check if the item coming in is not already a list. We make it one if it is not. 
if not isinstance(lines, list):
    lines = [lines]

#Creating an empty container to put our results in
results = []

#Here we check each element (Line) inside the list (Lines)
for line in lines:
    #If there is one element, we treat it a different way to multiple
    if len(lines) > 1:
        #We append the results to our empty "results" container
        results.append([line.StartPoint, line.EndPoint])
    else:
        #We append the results to our empty "results" container
        results.append(line.StartPoint)
        results.append(line.EndPoint)


#We return our "results" container out of the Python node back to Dynamo
OUT = results

edit:How Can I get start and end point using python - #3 by solamour
cordially
christian.stan

3 Likes

I gave up on ChatGPT :frowning:

@ib9YMLD

not necessarily need to abandon him, just be careful not to trust him completely :slightly_smiling_face:

1 Like


from code of M. Draxl :wink:


clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

#Input variable of "Lines"
lines = UnwrapElement(IN[0]).Location.Curve.ToProtoType()
1 Like

ChatGpt had a sharp nose, he took a code from Mr. Sol Amour

3 Likes

Excuse me, I made a mistake in case of List
here is correction

# Load the Python Standard and DesignScript Libraries
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

#Input  of "elt"
elt = UnwrapElement(IN[0])

#First we check if the item coming in is not already a list. We make it one if it is not. 
if not isinstance(elt, list):
    elt = [elt]

#Creating an empty container to put our results in
results = []

#Here we check each element (Line) inside the list (Lines)
for e in elt:
    #If there is one element, we treat it a different way to multiple
    if len(elt) > 1:
        #We append the results to our empty "results" container
        results.append([e.Location.Curve.ToProtoType().StartPoint, e.Location.Curve.ToProtoType().EndPoint])
    else:
        #We append the results to our empty "results" container
        results.append(e.Location.Curve.ToProtoType().StartPoint)
        results.append(e.Location.Curve.ToProtoType().EndPoint)


#We return our "results" container out of the Python node back to Dynamo
OUT = results

Sincerely
christian.stan

1 Like

Thanks, Christian, Stan, and Draxl-Andreas,

The solution from Stan is working for me. I have to admit that the one from Draxl-Andreas is providing too many start and end points for one line; I have to spend time understanding why.
It’s everything under clr. until the input line that is killing me with Python. Best Regards, Igor.

1 Like

Mr. Draxl’s code collects all the Detail lines of your project
that’s why you have a lot of points

Sincerely
christian.stan

1 Like

Darn ! , I’ve been fooled, they have pretty much the same writing syntax for comments :face_with_peeking_eye:

2 Likes