.NET

Reply
Contributor
Hans530
Posts: 11
Registered: ‎03-03-2012
Message 1 of 12 (2,393 Views)

SendStringToExecute

2393 Views, 11 Replies
03-19-2012 07:48 AM

 Hi Everybody

When the code below are executed the line, drawing the line are executed after the rest of the code,

that is the msgboxes are displayed before the line are drawn in Acad_Window.

what should be done to display the  msgboxes before the line, as the order in the code indicates

Hope someone has an explanation and solution to this

With Regards

HansP

''

Application.DocumentManager.MdiActiveDocument.SendStringToExecute("line_

1800,2001600,3000 ", True, False, True)

MsgBox("DWG Saved")

dwgPath = ThisDrawing.GetVariable("DWGPREFIX")

dwgName = ThisDrawing.GetVariable("DWGNAME")

Dim thisDwg AsString = dwgPath + dwgName

MsgBox(thisDwg)

*Expert Elite*
norman.yuan
Posts: 1,002
Registered: ‎04-27-2009
Message 2 of 12 (2,389 Views)

Re: SendStringToExecute

03-19-2012 08:14 AM in reply to: Hans530

What you should do is to use the .NET API to

 

  • Start a Transaction
  • Construct a Line object, such as:

  Dim l as Line=New Line

  Line.StartPoint=New Point3d(....)

  Line.EndPoint=New Point3d(...)

 

  • Set the line's properties as needed
  • Append the line to targeting space (Model or layout)
  • Commit the transaction

You can create a command method to cover all the steps aforemention, and then use SendStringToExecution() method as one call.

 

If the intention is to use all Acad existing/built-in commands, use AutoCAD script would do in most cases.

Contributor
Hans530
Posts: 11
Registered: ‎03-03-2012
Message 3 of 12 (2,388 Views)

Re: SendStringToExecute

03-19-2012 08:23 AM in reply to: Hans530

Thank you for your quick responce

 

The line worked fine, but how to do with a zoom command.

 

Hans P

Contributor
ranjith0326
Posts: 24
Registered: ‎04-16-2011
Message 4 of 12 (2,352 Views)

Re: SendStringToExecute

03-19-2012 10:05 PM in reply to: Hans530

Try with below one

 

Application.DocumentManager.MdiActiveDocument.SendStringToExecute("zoom e ", True, False, True)

Regards,

R.Ranjith
Moderator
Alexander.Rivilis
Posts: 1,419
Registered: ‎04-09-2008
Message 5 of 12 (2,346 Views)

Re: SendStringToExecute

03-19-2012 11:30 PM in reply to: Hans530

Hans530 wrote:

The line worked fine, but how to do with a zoom command.

 


http://forums.autodesk.com/t5/NET/ZoomWindow-and-ZoomScale/m-p/3249340#M26321


Пожалуйста не забывайте про Утвердить в качестве решения! Утвердить в качестве решения и Give Kudos!Баллы
Please remember to Accept Solution! Accept as Solution and Give Kudos!Kudos

Contributor
Hans530
Posts: 11
Registered: ‎03-03-2012
Message 6 of 12 (2,336 Views)

Re: SendStringToExecute

03-20-2012 03:57 AM in reply to: Alexander.Rivilis

 

 

I do not know anything about C# so, I translated the ZoomExtents like this. It compiled OK but there was a runtime error complaining about the BindingFlags. As I don’t know any C# and as it seems not enough VB either to translate that part of the code where several BindingFlags are listid. I must ask for further help with that part

Thanks in advance Hans P

 

public static void ZoomExtents()

    {

        object acad = Application.AcadApplication;

        acad.GetType().InvokeMember("ZoomExtents", BindingFlags.DeclaredOnly | BindingFlags.Public |

             BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, null);

    }

 

 

 

 

Public Sub ZoomExtents()

Dim acad As Object = Application.AcadApplication

acad.GetType().InvokeMember("ZoomExtents",BindingFlags.DeclaredOnly, Nothing, acad, Nothing)

End Sub

Moderator
Alexander.Rivilis
Posts: 1,419
Registered: ‎04-09-2008
Message 7 of 12 (2,334 Views)

Re: SendStringToExecute

03-20-2012 03:59 AM in reply to: Hans530
Imports System.Reflection

Пожалуйста не забывайте про Утвердить в качестве решения! Утвердить в качестве решения и Give Kudos!Баллы
Please remember to Accept Solution! Accept as Solution and Give Kudos!Kudos

Contributor
Hans530
Posts: 11
Registered: ‎03-03-2012
Message 8 of 12 (2,325 Views)

Re: SendStringToExecute

03-20-2012 04:37 AM in reply to: Alexander.Rivilis

Imports System.Reflection

I had that one without that it wouldn't compile

But is the row



acad.GetType().InvokeMember("ZoomExtents",BindingFlags.DeclaredOnly, Nothing, acad, Nothing)

translated ok from C#



 

 Hans P

Moderator
Alexander.Rivilis
Posts: 1,419
Registered: ‎04-09-2008
Message 9 of 12 (2,323 Views)

Re: SendStringToExecute

03-20-2012 04:44 AM in reply to: Hans530
acad.GetType().InvokeMember("ZoomExtents",BindingFlags.InvokeMethod, Nothing, acad, Nothing)

 


Пожалуйста не забывайте про Утвердить в качестве решения! Утвердить в качестве решения и Give Kudos!Баллы
Please remember to Accept Solution! Accept as Solution and Give Kudos!Kudos

*Expert Elite*
_gile
Posts: 2,094
Registered: ‎04-29-2006
Message 10 of 12 (2,296 Views)

Re: SendStringToExecute

03-20-2012 03:08 PM in reply to: Alexander.Rivilis

Hi,

 

While using Reflection/Late binding, we can use some (extension) methods to make the code more readable than the :

GetType().InvokeMember(...)

 

With C# and Framework 3.5 or upper, we can write some extension methods so that the upper expression to ma make zoom extents become:

acad.Invoke("ZoomExtents");

or, to set the cursor size to 10:

acad.Get("Preferences").Get("Display").Set("CursorSize", 10);

 

public static class LateBinding
{
	public static object Get(this object obj, string propName, params object[] parameter)
	{
		return obj.GetType().InvokeMember(propName, BindingFlags.GetProperty, null, obj, parameter);
	}

	public static void Set(this object obj, string propName, params object[] parameter)
	{
		obj.GetType().InvokeMember(propName, BindingFlags.SetProperty, null, obj, parameter);
	}

	public static object Invoke(this object obj, string methName, params object[] parameter)
	{
		return obj.GetType().InvokeMember(methName, BindingFlags.InvokeMethod, null, obj, parameter);
	}
}

 

With F#, it's really easy to extend any Type, but ther's no way (AFAIK) to use optional parameters (as with params or ParamArray), but creating an array is so simple.

The zoom extents:

acad.invoke("ZoomExtents", null) |> ignore

The cursor to 10:
let size = acad.get("Preferences", null).get("Display", null).set("CursorSize", [| 10 |])

 

type Object with
    member x.get(propName, parameter) = 
        x.GetType().InvokeMember(propName, BindingFlags.GetProperty, null, x, parameter)

    member x.set(propName, parameter) = 
        x.GetType().InvokeMember(propName, BindingFlags.SetProperty, null, x, parameter)
        |> ignore

    member x.invoke (propName, parameter) = 
        x.GetType().InvokeMember(propName, BindingFlags.InvokeMethod, null, x, parameter)

 

VB do not allow to use extension methods with the Object Type, but we can define methods so that late binding expressions look like the vlax-get, vlax-put, and vlax,invoke LISP functions.

The zoom extents:

Invoke(acad, "ZoomExtents")

The cursor to 10:
SetProperty(GetProperty(GetProperty(acad, "Preferences"), "Display"), "CursorSize", 10)

 

Module LateBindingExtensions

    Public Function GetProperty(ByVal obj As Object, ByVal propName As String, ByVal ParamArray parameter As Object()) As Object
        Return obj.GetType().InvokeMember(propName, BindingFlags.GetProperty, Nothing, obj, parameter)
    End Function

    Public Sub SetProperty(ByVal obj As Object, ByVal propName As String, ByVal ParamArray parameter As Object())
        obj.GetType().InvokeMember(propName, BindingFlags.SetProperty, Nothing, obj, parameter)
    End Sub

    Public Function Invoke(ByVal obj As Object, ByVal methName As String, ByVal ParamArray parameter As Object()) As Object
        Return obj.GetType().InvokeMember(methName, BindingFlags.InvokeMethod, Nothing, obj, parameter)
    End Function

End Module

 


Gilles Chanteau
Need installation help?

Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.