Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 18 Next »

ARES Commander provides .NET API that lets you author third party Plugin Software for ARES Commander.

Supported API Sets 

ARES Commander supports three API sets that you can use independently.

  1. .NET Classic API
  2. ARES COM API
  3. CFx .NET (SWIG generated .NET API version of ARES C++ SDK)
API Assembly NamesNature of PluginLoading Mechanism
NET Classic API

TD_Mgd_x.xx_xx.dll

FxCoreMgd_x.xx_xx.dll

In-processUse the NETLOAD command

ARES COM API

ARESC.exe

OdaX_x.xx_xx.dll

TD_Mgd_x.xx_xx.dll(For In-process plugin only)

In-process

Out-process

  • In-process-Use the NETLOAD command
  • Out-rocess-  Runs as a separated EXE
CFx .NET

ArgonMGD.dll

TD_SwigCoreMgd.dll

TD_SwigDbMgd.dll

TG_SwigDbMgd.dll

TD_Mgd_x.xx_xx.dll

In-processUse the NETLOAD command

Creating a .NET Classic Plugin:

  1. Create a new C# or VB.NET project using the Visual Studio project creation Wizard(  **minimum requirement .NET Framework v4.5)

  2. From Solution Explore, add references of TD_Mgd_x.xx_xx*.dll and FxCoreMgd_x.xx_xx.dll from the ARES Commander installation folder.



    You can see all available NameSpaces, Classes, Methods, and Properties in each assembly in the Object Browser.


               
  3. Rename Class1.cs to PluginCommands.cs. This changes the class Class1 to class PluginCommands, as in the following example.

  4. Defining a command uses Teigha.Runtime namespace to access CommandMethod method attribute and adds a method, such as AnyFunctionName that has this attribute. The following example defines the MySampleCommand command which you can run later in ARES Commander, from the command prompt.
    You can define all types of in-process plugin using a similar procedure.
  5. Build the sample project to generate PluginCommans.dll or <YourProjectName.dll>.
  6. Start ARES Commander and type NETLOAD at the command prompt. Next, browse and load the plugin dll (PluginCommands.dll).
    The coommand window displays a confirmation message.
  7. Run MySampleCommand, which executes the AnyFunctionName method. 

Accessing Application Object

Accessing Documents and ActiveDocument

You can access the Document Manager from the application object.

The Document Manager provides properties and methods that let you perform the following:

  • Access the active document
  • Add a new document
  • Open existing drawings.

 

Prompting for User Input 

The Editor class controls the user input and prints the output into command window. All related classes for prompting on the command window are available in Teigha.EditorInput namespace.

            Document activeDocument = docManager.MdiActiveDocument;
            Editor ed = activeDocument.Editor;

            PromptIntegerOptions op = new PromptIntegerOptions("Input a positive integer");
            op.AllowNegative = false;
            PromptIntegerResult res =(PromptIntegerResult) ed.DoPrompt(op);
            if( res.Status == PromptStatus.OK)
            {
                int retVal = res.Value;
            }

Creating .NET Extension Application

.NETExtension Application lets you run your code while loading the plugin. For example, you can create the Plugin as an Extension Application to display tabs on the Ribbon or palettes while the plugin is loading in the software.

To create the Plugin as an Extension Application, add a class that implements IExtensionApplication interface. Each plugin can have only one class of this type.

When you load the plugin using the NETLOAD command, the software automatically calls public void Initialize(). When the System unloads the plugin, it calls Terminate.


Defining .NET LispFunction

Third party can define .NET methods that you can use later in LISP. The following example defines the lisptest function using the LispFunction Method attribute.

To call the lisptest function, use the following LISP script:

(setq x (lisptest "Text created by .NET lisp function" 1.0 '(10 10 0)))

        //Method attribute to define lisp callable function 'LispTest' 
        //i.e (setq x (lisptest "Text created by .NET lisp function" 1.0 '(10 10 0)))
        [LispFunction("lisptest")]
        public ResultBuffer DoIt(ResultBuffer args)
        {
            // Get the database of the active document.
            Database db = HostApplicationServices.WorkingDatabase;
            TypedValue[] argsVal = new TypedValue[3];
            if (args != null)
            {
                argsVal = args.AsArray();
            }
            else
            {
                argsVal[0] = new TypedValue((int)LispDataType.Text, "Default Text");
                argsVal[1] = new TypedValue((int)LispDataType.Double, .2);
                argsVal[1] = new TypedValue((int)LispDataType.Point3d, new Point3d(0, 0, 0));
            }
            // Set up transaction manager.
            Teigha.DatabaseServices.TransactionManager tm = db.TransactionManager;
            using (Transaction tr = tm.StartTransaction())
            {
                try
                {
                    Point3d pPosition = new Point3d(0, 0, 0);

                    // Create a new MText object and set properties.
                    DBText pText = new DBText();
                    pText.TextString = (String)argsVal[0].Value;
                    pText.Height = Convert.ToDouble(argsVal[1].Value);
                    pText.Position = (Point3d)argsVal[2].Value;

                    // Get model space to add the MText object.
                    BlockTable pBlockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
                    BlockTableRecord pModelSpace = (BlockTableRecord)tr.GetObject(pBlockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                    // Add the object to the model space.
                    ObjectId id = pModelSpace.AppendEntity(pText);
                    tr.AddNewlyCreatedDBObject(pText, true);

                    // Commit changes to database.
                    tr.Commit();
                    //return created text entity to lisp
                    return new ResultBuffer(new TypedValue((int)LispDataType.ObjectId, id));
                }
                finally
                {
                    // delete tr , managed by c# with garbage collection
                }

            }
        }

Migrating AutoCAD® .NET Classic Application to ARES Commander

You can migrate .NET applications running on AutoCAD® platform to ARES Commander with minimal changes.

  • Replace AutoCAD® .NET assemblies with ARES .NET assemblies.
  • Replace Autodesk.AutoCAD namespace with Teigha namespace in the source code.

Advance Migration

If you do not want to maintain separate source code for AutoCAD® and ARES Commander, then additional steps are necessary. A single project with two build configuration solves the issue.

Step 1: Create a new build configuration for AutoCAD® and ARES Commander.

 

Step 2: Using project Properties, select all configurations one by one and define Symbol “AutoCAD” or “ARES” for the corresponding configurations.

For AutoCAD_Release configuration:

 

For ARES_Release:

 

 Step 3: Add Conditional reference assemblies to the project using Symbols. Modify csproj file manually in the text editor to add condition for all references as in the following example.


<ItemGroup>

    <Reference Include="accoremgd" Condition="$(DefineConstants.Contains('AutoCAD'))">

      <HintPath>C:\Program Files\Autodesk\AutoCAD 2018\accoremgd.dll</HintPath>

    </Reference>

    <Reference Include="acdbmgd" Condition="$(DefineConstants.Contains('AutoCAD'))">

      <HintPath>C:\Program Files\Autodesk\AutoCAD 2018\acdbmgd.dll</HintPath>

    </Reference>

    <Reference Include="acmgd" Condition="$(DefineConstants.Contains('AutoCAD'))">

      <HintPath>C:\Program Files\Autodesk\AutoCAD 2018\acmgd.dll</HintPath>

    </Reference>

    <Reference Include="FxCoreMgd_4.03_14" Condition="$(DefineConstants.Contains('ARES'))">

      <HintPath>C:\Program Files\Graebert GmbH\ARES Commander 2018\BIN\FxCoreMgd_4.03_14.dll</HintPath>

    </Reference>

    <Reference Include="TD_Mgd_4.03_14" Condition="$(DefineConstants.Contains('ARES'))">

      <HintPath>C:\Program Files\Graebert GmbH\ARES Commander 2018\BIN\TD_Mgd_4.03_14.dll</HintPath>

    </Reference>

  </ItemGroup>

Step 4: Changes in the source code add using directives for both the application conditionally and Replace Autodesk.AutoCAD to CADApp in *.cs source files which is defined conditional declaration below.

 

#if  ARES

using Teigha.DatabaseServices;

using Teigha.Runtime;

using Teigha.Geometry;

using Teigha.ApplicationServices;

using Teigha.EditorInput;

using CADApp = Teigha;

#elif  AutoCAD

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using CADApp = Autodesk.AutoCAD;

#endif

//If we define using statement as above then while porting no need to write as below
#if ARES
Teigha.Colors.Color acadColor = Teigha.Colors.Color.FromRgb(color.R, color.G, color.B);
#else
Autodesk.AutoCAD.Colors.Color acadColor = Autodesk.AutoCAD.Colors.Color.FromRgb(color.R, color.G, color.B);
#endif

//ported code will be

CADApp.Colors.Color acadColor = Teigha.Colors.Color.FromRgb(color.R, color.G, color.B);

Step 5:

Specify separate Output folders for both configurations.

Build both configurations one by one. The builds will work with their corresponding applications.

 








  • No labels