Pick Point node that works for active document (Civil3D)

Hi,

I’m trying to add a Pick Point feature inside a script that pops-up for the user to pick a point in the model. I’ve tried different ways but each of them have its limitation.

  1. I’ve tried using this script below that comes from LinkDWG package.
#LinkDWG Core DYF by Koz Jono YEOH
#kozmosovia@hotmail.com
#Copyright(C) 1994-2020 KozMos Inc.
#Copyright(C) 2011-2020 Neila Heaven Networks
#Copyright(C) 2017-2020 Tachyon Intelligent Design Institute

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import System
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import MessageBox

msg="Pick a point"
osm=169
doc=System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application").ActiveDocument
rrr=None

if IN[0] == True and doc:
	try:
		mbx="Pick a point in the drawing to create new assembly."
		MessageBox.Show(mbx, "LinkDWG Message")
		old=doc.GetVariable("osmode")
		usr=doc.GetVariable("users5")
		doc.SetVariable("osmode", int(osm))
		doc.Activate()
		doc.SendCommand("(setq pt(getpoint\042" + msg + "\042)) ")
		doc.SendCommand("(and pt(setvar\042users5\042(strcat(rtos(car pt))\042#\042(rtos(cadr pt))\042#\042(rtos(caddr pt))))(setq pt nil)) ")
		rtn=doc.GetVariable("users5")
		doc.SetVariable("osmode", old)
		if rtn != usr:
			rtn=rtn.split("#")
			if len(rtn) == 3:
				rrr=Point.ByCoordinates(float(rtn[0]),float(rtn[1]),float(rtn[2]))
				doc.SetVariable("users5", usr)
	except: pass
else:
	rrr=[]
OUT = rrr

But having a problem when I have multiple documents opened because the script goes and activates the first opened document session (ei. If two Civil3D sessions are opened - the pick point function is activated in another session that I don’t want). And I found out that this happens since the script goes through the system and GetActiveObejct, it selects the one that was opened first. I think the ‘UIApplication.ActiveUIDocument.Document’ solves this issue for Revit, but haven’t figured out how to apply this to Civil3D.

  1. Data-Shape pick point node only offer picking point on a face so this is not what I need.
  2. And there’s a Pick Point node in Civil3D but it doesn’t offer pop-up function and doesn’t work in Dynamo Player either. I have left an inquiry about this already - waiting to hear back.

I think revising LinkDWG script to pick the active document I’m working on would be the best bet, but not sure how to. Can anyone help?

Thanks,

You should be able to use the document manager for this:

Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument

Check out this post.

It works perfectly. Thank you so much :slight_smile: !!