• Industries
  • Products
  • Buy
  • Services & Support
  • Communities
  • Discussion Groups

    .NET

    Reply
    Active Member
    Posts: 8
    Registered: ‎03-03-2012

    SendStringToExecute

    856 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)

    Please use plain text.
    *Expert Elite*
    Posts: 679
    Registered: ‎04-27-2009

    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.

    Please use plain text.
    Active Member
    Posts: 8
    Registered: ‎03-03-2012

    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

    Please use plain text.
    Contributor
    ranjith0326
    Posts: 24
    Registered: ‎04-16-2011

    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
    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,167
    Registered: ‎04-09-2008

    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

    Please use plain text.
    Active Member
    Posts: 8
    Registered: ‎03-03-2012

    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

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,167
    Registered: ‎04-09-2008

    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

    Please use plain text.
    Active Member
    Posts: 8
    Registered: ‎03-03-2012

    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

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,167
    Registered: ‎04-09-2008

    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

    Please use plain text.
    *Expert Elite*
    Posts: 1,639
    Registered: ‎04-29-2006

    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
    Please use plain text.