Civil 3D Pressure Pipe Network Nodes Problem!

import sys
import clr

# Add Assemblies for AutoCAD and Civil 3D APIs
clr.AddReference('acmgd')
clr.AddReference('acdbmgd')
clr.AddReference('accoremgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')
clr.AddReference('AeccPressurePipesMgd')
clr.AddReference('acdbmgdbrep')
clr.AddReference('System.Windows.Forms')
clr.AddReference('Civil3DNodes')

# Create an alias to the Autodesk.AutoCAD.ApplicationServices.Application class
import Autodesk.AutoCAD.ApplicationServices.Application as acapp

# Import references from AutoCAD
from Autodesk.AutoCAD.Runtime import *
from Autodesk.AutoCAD.ApplicationServices import *
from Autodesk.AutoCAD.EditorInput import *
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *

# Import references for Civil 3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *

adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor
civdoc = CivilApplication.ActiveDocument


PROFILE_VIEW = IN[0]





def move_labels(PROFILE_VIEW):
	if not hasattr(PROFILE_VIEW, "__iter__"):
		PROFILE_VIEW = [PROFILE_VIEW]
	error_report = None
	res = []
	resp = []
	resf = []
	resa = []
	try:
		with adoc.LockDocument():		
		    with adoc.Database as db:		
		        with db.TransactionManager.StartTransaction() as t:		    
		            sampleLineId = PROFILE_VIEW[0].InternalObjectId
		            objVIEW = t.GetObject(sampleLineId, OpenMode.ForWrite)
		            
		            for i in  objVIEW.GetPipeIds():
						objpp = t.GetObject(i, OpenMode.ForWrite)
						resp.append(objpp)
		            
		            for i in  objVIEW.GetFittingIds():
						objpf = t.GetObject(i, OpenMode.ForWrite)
						resf.append(objpf)
																
																
		            
		            for i in  objVIEW.GetAppurtenanceIds():
						objpa = t.GetObject(i, OpenMode.ForWrite)
						resa.append(objpa)

		            t.Commit()
	except:
		import traceback
		error_report = traceback.format_exc()
	if error_report is None:
		return [resp,resf,resa]   
	else:
		return error_report

OUT = move_labels(PROFILE_VIEW)





I really Appreciate Your help and your time but still there is a problem.

May I know the ultimate goal of your idea so that I can help you?

The pipe (if it is straight or arc) can be turned into a FEATURE LINES
To get a geometry

can you attach
Example civil file
+
dynamo file

I just have a c3d file contains pressure pipe network and i need to get pipe geometries like centerline curve and solids.

I use civil3d toolkit package and it’s nodes does not generate required output so, I tried your python code and i get the upper results.

import sys
import clr

# Add Assemblies for AutoCAD and Civil 3D APIs
clr.AddReference('acmgd')
clr.AddReference('acdbmgd')
clr.AddReference('accoremgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')
clr.AddReference('AeccPressurePipesMgd')
clr.AddReference('acdbmgdbrep')
clr.AddReference('System.Windows.Forms')
clr.AddReference('Civil3DNodes')

# Create an alias to the Autodesk.AutoCAD.ApplicationServices.Application class
import Autodesk.AutoCAD.ApplicationServices.Application as acapp

# Import references from AutoCAD
from Autodesk.AutoCAD.Runtime import *
from Autodesk.AutoCAD.ApplicationServices import *
from Autodesk.AutoCAD.EditorInput import *
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *

# Import references for Civil 3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *

adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor
civdoc = CivilApplication.ActiveDocument


PROFILE_VIEW = IN[0]





def move_labels(PROFILE_VIEW):
	if not hasattr(PROFILE_VIEW, "__iter__"):
		PROFILE_VIEW = [PROFILE_VIEW]
	error_report = None
	res = []
	resp = []
	resf = []
	resa = []
	try:
		with adoc.LockDocument():		
		    with adoc.Database as db:		
		        with db.TransactionManager.StartTransaction() as t:		    
		            sampleLineId = PROFILE_VIEW[0].InternalObjectId
		            objVIEW = t.GetObject(sampleLineId, OpenMode.ForWrite)
		            
		            for i in  objVIEW.GetPipeIds():
						objpp = t.GetObject(i, OpenMode.ForWrite)
						#resp.append( objpp.Get3dBody().Area )
						#resp.append( dir (objpp.Get3dBody() ) )
						resp.append( objpp.Get3dBody())
		            
		            for i in  objVIEW.GetFittingIds():
						objpf = t.GetObject(i, OpenMode.ForWrite)
						resf.append(objpf.Get3dBody())
																
																
		            
		            for i in  objVIEW.GetAppurtenanceIds():
						objpa = t.GetObject(i, OpenMode.ForWrite)
						resa.append(objpa.Get3dBody())

		            t.Commit()
	except:
		import traceback
		error_report = traceback.format_exc()
	if error_report is None:
		return [resp,resf,resa]   
	else:
		return error_report

OUT = move_labels(PROFILE_VIEW)






:frowning:

It should be the CIVIL 3d 2021,2 version
before there is no mothed

With an update in Civil3D 2021.2, there is an update in PressurePipe API. Now there is a function available to get the solid body of a PressurePart

1 Like

It’s not going to be possible to mix Python code with nodes from the Civil 3D Toolkit. The furthest you’ll be able to go with Python is to output an object from the Autodesk.Civil.DatabaseServices namespace, but then you can’t use that object type with Civil 3D Toolkit nodes because everything is in a different assembly with completely different classes. This has nothing to do with Dynamo because these are object-oriented programming principles.

If you want to use Python and the API, then you have to use it all the way. In other words, you’ll have to get the solids, curves, etc. via Python and not the Toolkit if you are getting the pressure pipe network and pipes/fittings/appurtenances via Python.

3 Likes

hi @ingenieroahmad

try this