Zoom to a specific location in model space

I am not sure but there might be a node to set a view to a viewport. And nodes to create a named view in modelspace. At the moment I can’t check how it works, maybe tomorrow.

There is no node yet to set a view to a viewport. I’ll put it on the wish-list.

Does anyone know why I have this message error:
Warning: NameError : name ‘acapp’ is not defined [’ File “”, line 29, in \n’]
image

This is the code I modified:

# Load the Python Standard and DesignScript Libraries
import sys
import clr

# Add Assemblies for AutoCAD and Civil3D
clr.AddReference('AcMgd')
clr.AddReference('AcCoreMgd')
clr.AddReference('AcDbMgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')

# 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 from Civil3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *

import System
from System import Array 
from System import Collections

# The inputs to this node will be stored as a list in the IN variables.
adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor
civdoc = CivilApplication.ActiveDocument
AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application

name = IN[0]
layer = IN[1]

def explode_stpoints(name, layer):
    error_report = None
    res = []
    object_ids_list = []
    try:
        with adoc.LockDocument():
            with adoc.Database as db:
                with db.TransactionManager.StartTransaction() as t:
                    # Place your code below
                    bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite)
                    btr = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)

                    lm = LayoutManager.Current.CurrentLayout = name
                    lmm = LayoutManager.Current
                    objly = t.GetObject(lmm.GetLayoutId(lmm.CurrentLayout), OpenMode.ForWrite)
                    vids = objly.GetViewports()

                    if vids.Count > 0:
                        vport = t.GetObject(vids[1], OpenMode.ForWrite)
                        vport.Locked = False
                        vport.On = True
                        vport.Visible = True

                        ed.SwitchToModelSpace()

                        command = f"QSELECT\nL\n==\n{layer}\nEXPLODE\n"
                        adoc.SendStringToExecute(command, True, False, False)

                        ed.SwitchToPaperSpace()

                        vport.Locked = True
                        vport.UpdateDisplay()

                        commandq = "_QSAVE\n"
                        adoc.SendStringToExecute(commandq, True, False, False)

                    t.Commit()
    except:
        import traceback
        error_report = traceback.format_exc()

    if error_report is None:
        return commandq
    else:
        return error_report

# Assign your output to the OUT variable.
OUT = explode_stpoints(name, layer)

adding this to your code

Thanks, but still doesn’t work:

start By writing the code Line by line
from here

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
#import Autodesk.AutoCAD.ApplicationServices.Application as acapp
acapp = Autodesk.AutoCAD.ApplicationServices.Application
# 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 *

import System
from System import Array 
from System import Collections

adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor
civdoc = CivilApplication.ActiveDocument
AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application

name = IN[0]
layer = IN[1]

def explode_stpoints(name, layer):
    error_report = None
    res = []
    object_ids_list = []
    try:
        with adoc.LockDocument():
            with adoc.Database as db:
                with db.TransactionManager.StartTransaction() as t:
                    # Place your code below
                    #bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite)
                    #btr = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)

                    #lm = LayoutManager.Current.CurrentLayout = name
                    #lmm = LayoutManager.Current
                    #objly = t.GetObject(lmm.GetLayoutId(lmm.CurrentLayout), OpenMode.ForWrite)
                    #vids = objly.GetViewports()


                    t.Commit()
    except:
        import traceback
        error_report = traceback.format_exc()

    if error_report is None:
        return name
    else:
        return error_report

# Assign your output to the OUT variable.
OUT = explode_stpoints(name, layer)

Thanks @hosneyalaa,

That worked, now the problem is only in my code.

I was close, I will continue trying and investigating if my code is correct, if I can’t, could you help me. :sweat_smile:

wirte code by ironpython2 will working
1

@hosneyalaa I tried,

but looks like there is an error in my code,

There is my code by the way I hope someone can help me.

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
#import Autodesk.AutoCAD.ApplicationServices.Application as acapp
acapp = Autodesk.AutoCAD.ApplicationServices.Application
# 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 *

import System
from System import Array 
from System import Collections

adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor
civdoc = CivilApplication.ActiveDocument
AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application

name = IN[0]
layer = IN[1]

def explode_stpoints(name, layer):
    error_report = None
    res = []
    object_ids_list = []
    try:
        with adoc.LockDocument():
            with adoc.Database as db:
                with db.TransactionManager.StartTransaction() as t:
                    # Place your code below
                    bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite)
                    btr = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)

                    lm = LayoutManager.Current.CurrentLayout = name
                    lmm = LayoutManager.Current
                    objly = t.GetObject(lmm.GetLayoutId(lmm.CurrentLayout), OpenMode.ForWrite)
                    vids = objly.GetViewports()
                    
                    if vids.Count > 0:
                        vport = t.GetObject(vids[1], OpenMode.ForWrite)
                        vport.Locked = False
                        vport.On = True
                        vport.Visible = True

                        ed.SwitchToModelSpace()
                        command = f"QSELECT\nL\n==\n{layer}\nEXPLODE\n"
                        adoc.SendStringToExecute(command, True, False, False)
                        ed.SwitchToPaperSpace()
                        vport.Locked = True
                        vport.UpdateDisplay()
                        commandq = "_QSAVE\n"
                        adoc.SendStringToExecute(commandq, True, False, False)


                    t.Commit()
    except:
        import traceback
        error_report = traceback.format_exc()

    if error_report is None:
        return name
    else:
        return error_report

# Assign your output to the OUT variable.
OUT = explode_stpoints(name, layer)

TRY

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
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 *

import System
from System import Array 
from System import Collections

adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor
civdoc = CivilApplication.ActiveDocument
AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application
#import AcadApplication

#XX= IN[1]
#YY= IN[2]


vp  = IN[1]
name  = IN[0]

def move_labels( name,vp ):
	#if not hasattr(objects, "__iter__"):
		#objects = [objects]
	#if not hasattr(yy, "__iter__"):
		#yy = [yy]
	#if not hasattr(lys, "__iter__"):
		#lys = [lys]
	error_report = None
	res = []
	object_ids_list = []
	try:
		with adoc.LockDocument():		
		    with adoc.Database as db:		
		        with db.TransactionManager.StartTransaction() as t:		    
		            bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite)
		            btr = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)
		            
		            #ii = 0
		            lm = LayoutManager.Current.CurrentLayout =name
		            lmm = LayoutManager.Current
		            objly = t.GetObject(lmm.GetLayoutId(lmm.CurrentLayout), OpenMode.ForWrite)
		            vids = objly.GetViewports()
		            if vids.Count > 0:
		               vport = t.GetObject(vids[1], OpenMode.ForWrite)
		               
		               ed.SwitchToModelSpace()
		               command = "zoom\nA\n"
		               adoc.SendStringToExecute(command, True, False, False)
               
		               ed.SwitchToPaperSpace()
		            
		            t.Commit()
	except:
		import traceback
		error_report = traceback.format_exc()
	if error_report is None:
		return vport
	else:
		return error_report


OUT = move_labels(  name,vp  )

11

2 Likes

Method to use API to center Model Space to UCS coordinates

import clr
import traceback

# Add Assemblies for AutoCAD and Civil3D
clr.AddReference("AcMgd")
clr.AddReference("AcCoreMgd")
clr.AddReference("AcDbMgd")

# 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 *

adoc = Application.DocumentManager.MdiActiveDocument
ed = adoc.Editor

with adoc.LockDocument():
    with adoc.Database as db:
        with db.TransactionManager.StartTransaction() as t:
            try:
                if not db.TileMode:
                    db.TileMode = True  # Model space

                # Define in UCS coordinates / units
                centerpoint = IN[0]  # list of [x , y] coordinates
                width = IN[1]  # int or float

                current_view = ed.GetCurrentView()
                
                # Just move view - no scale
                if not width:
                    width = current_view.Width

                ratio = current_view.Height / current_view.Width
                current_view.Width = width
                current_view.Height = width * ratio
                current_view.CenterPoint = Point2d(0, 0)
                current_view.Target = Point3d(*centerpoint, 0)

                ed.SetCurrentView(current_view)

                OUT = current_view.Width, current_view.Height, current_view.Target
            except:
                OUT = traceback.format_exc()
            t.Commit()

Cool, Thanks.

Now I get a message that my Iron Python 2 package is not installed but when I go to install it I get a message that the package is already installed.

What should I do?

I solved it, uninstalling it and installing it again.

Now let me try my code.

Thanks @hosneyalaa

I add this line

 command = "-qselect\nL\nC_POINTS_Setout Point\nEXPLODE\n\n"

but I don’t know why is asking me to drawn a line, where I can find a guide to learn how to use this method.

Where did you get it from?
It won’t work for you Because he A window appears
11

It is suppose that -qselect open qselect as a hide mode, I got it from chatGPT :sweat_smile:

I expected this
So I asked you

I’m still looking for learn how to do that what do you suggest me?

I do not know ,What do you do
without Example drawing

Want to explode points?
do before moving in layout

The problem with explode the points in the model is that when you return to the layout the orientation of the labels moves, this does not happen when you enter the viewport and explode them from there.