We provided various jig implementations before, either using EntityJig or DrawJig, either from scratch or with the assistance of the Entity Jigger or Draw Jigger of AcadNetAddinWizard(Pro).
We demonstrated previously how to jig a MultiLeader programmatically through an arrow location and a single landing location using AutoCAD .NET and C#. In this post, let’s see how to jig multiple landing locations by modifying the previous MultiLeader (MLeader) Jig a little bit.
Here we go.
#region Namespaces
using System;
using System.Text;
using System.Linq;
using System.Xml;
using System.Reflection;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Windows;
using MgdAcApplication = Autodesk.AutoCAD.ApplicationServices.Application;
using MgdAcDocument = Autodesk.AutoCAD.ApplicationServices.Document;
using AcWindowsNS = Autodesk.AutoCAD.Windows;
#endregion
namespace AcadNetCSharp
{
public class MLeaderJigger2 : EntityJig
{
#region Fields
public int mCurJigFactorIndex = 1; // Jig Factor Index
public Autodesk.AutoCAD.Geometry.Point3d mArrowLocation; // Jig Factor #1
public Autodesk.AutoCAD.Geometry.Point3d mTextLocation; // Jig Factor #2
#endregion
#region Constructors
public MLeaderJigger2(MLeader ent)
: base(ent)
{
Entity.SetDatabaseDefaults();
Entity.ContentType = ContentType.MTextContent;
Entity.MText = new MText();
Entity.MText.SetDatabaseDefaults();
Entity.EnableDogleg = true;
Entity.EnableLanding = true;
Entity.EnableFrameText = false;
Entity.AddLeaderLine(mTextLocation);
Entity.SetFirstVertex(0, mArrowLocation);
Entity.TransformBy(UCS);
}
#endregion
#region Properties
private Editor Editor
{
get
{
return MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;
}
}
private Matrix3d UCS
{
get
{
return MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
}
}
#endregion
#region Overrides
public new MLeader Entity // Overload the Entity property for convenience.
{
get
{
return base.Entity as MLeader;
}
}
protected override bool Update()
{
switch (mCurJigFactorIndex)
{
case 1:
Entity.SetFirstVertex(0, mArrowLocation);
Entity.SetLastVertex(0, mArrowLocation);
break;
case 2:
default:
Entity.SetLastVertex(0, mTextLocation);
break;
}
return true;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
switch (mCurJigFactorIndex)
{
case 1:
JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\nArrow Location:");
// Set properties such as UseBasePoint and BasePoint of the prompt options object if necessary here.
prOptions1.UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.GovernedByOrthoMode | UserInputControls.GovernedByUCSDetect | UserInputControls.UseBasePointElevation;
PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
if (prResult1.Status == PromptStatus.Cancel && prResult1.Status == PromptStatus.Error)
return SamplerStatus.Cancel;
if (prResult1.Value.Equals(mArrowLocation)) //Use better comparison method if necessary.
{
return SamplerStatus.NoChange;
}
else
{
mArrowLocation = prResult1.Value;
return SamplerStatus.OK;
}
case 2:
default:
JigPromptPointOptions prOptions2 = new JigPromptPointOptions("\nLanding Location:");
prOptions2.Keywords.Add("Done");
prOptions2.UseBasePoint = true;
prOptions2.BasePoint = mTextLocation == Point3d.Origin ? mArrowLocation : mTextLocation;
prOptions2.UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.GovernedByOrthoMode | UserInputControls.GovernedByUCSDetect | UserInputControls.UseBasePointElevation;
PromptPointResult prResult2 = prompts.AcquirePoint(prOptions2);
if (prResult2.Status == PromptStatus.Cancel && prResult2.Status == PromptStatus.Error)
return SamplerStatus.Cancel;
if (prResult2.Value.Equals(mTextLocation)) //Use better comparison method if necessary.
{
return SamplerStatus.NoChange;
}
else
{
mTextLocation = prResult2.Value;
return SamplerStatus.OK;
}
}
}
#endregion
#region Methods to Call
public static MLeader Jig()
{
MLeaderJigger2 jigger = null;
try
{
jigger = new MLeaderJigger2(new MLeader());
PromptResult pr;
do
{
pr = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.Drag(jigger);
if (pr.Status == PromptStatus.Keyword)
{
// Keyword handling code
if(pr.StringResult == "Done")
{
break;
}
}
else
{
jigger.mCurJigFactorIndex++;
if (jigger.mCurJigFactorIndex > 2)
jigger.Entity.AddLastVertex(0, jigger.mTextLocation);
}
} while (pr.Status != PromptStatus.Cancel && pr.Status != PromptStatus.Error );
if (pr.Status == PromptStatus.Cancel || pr.Status == PromptStatus.Error)
{
if (jigger != null && jigger.Entity != null)
jigger.Entity.Dispose();
return null;
}
else
{
PromptResult prLabel = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.GetString("Label: ");
MText text = new MText();
text.Contents = prLabel.StringResult;
text.TransformBy(jigger.UCS);
jigger.Entity.MText = text;
return jigger.Entity;
}
}
catch
{
if (jigger != null && jigger.Entity != null)
jigger.Entity.Dispose();
return null;
}
}
#endregion
#region Test Commands
[CommandMethod("TestMLeaderJigger2")]
public static void TestMLeaderJigger2_Method()
{
try
{
Entity jigEnt = MLeaderJigger2.Jig();
if (jigEnt != null)
{
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
btr.AppendEntity(jigEnt);
tr.AddNewlyCreatedDBObject(jigEnt, true);
tr.Commit();
}
}
}
catch (System.Exception ex)
{
MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
}
}
#endregion
}
}
The workflow and output may look like the following:
As can be seen, as many as landing locations can be dragged this time by the same single Multileader (MLeader) Jig. UCS is also honored perfectly. From coding perspective, the MLeaderJigger version 2 was updated a bit from the MLeaderJigger version 1 as introduced before, whose fundamental jigging framework was set up by the Entity Jigger of AcadNetAddinWizardPro .
By the way, the leading edge AutoCAD .NET Addin Wizard Professional (AcadNetAddinWizardPro) helped create the project, the jig class, and the test command automatically in a moment. If you find the article, code, or any wizards/coders/widgets or AcadNetAddinWizardPro, please kindly make a donation.
Recent Comments