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#. We also showed how to jig multiple landing locations. In this post, let’s see how to jig a block content instead of the default MText content.
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 MLeaderJigger3 : EntityJig
{
#region Fields
private const string BlockName = "tag";
public int mCurJigFactorIndex = 1; // Jig Factor Index
public Autodesk.AutoCAD.Geometry.Point3d mArrowLocation; // Jig Factor #1
public Autodesk.AutoCAD.Geometry.Point3d mLandingLocation; // Jig Factor #2
#endregion
#region Constructors
public MLeaderJigger3(MLeader ent)
: base(ent)
{
Entity.SetDatabaseDefaults();
Entity.ContentType = ContentType.BlockContent;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
Entity.BlockContentId = bt[BlockName];
tr.Commit();
}
Entity.EnableDogleg = true;
Entity.EnableLanding = true;
Entity.EnableFrameText = false;
Entity.AddLeaderLine(mLandingLocation);
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:
Entity.SetLastVertex(0, mLandingLocation);
break;
default:
return false;
}
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:
JigPromptPointOptions prOptions2 = new JigPromptPointOptions("\nLanding Location:");
// Set properties such as UseBasePoint and BasePoint of the prompt options object if necessary here.
prOptions2.UseBasePoint = true;
prOptions2.BasePoint = mArrowLocation;
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(mLandingLocation)) //Use better comparison method if necessary.
{
return SamplerStatus.NoChange;
}
else
{
mLandingLocation = prResult2.Value;
return SamplerStatus.OK;
}
default:
break;
}
return SamplerStatus.OK;
}
#endregion
#region Methods to Call
public static MLeader Jig()
{
MLeaderJigger3 jigger = null;
try
{
jigger = new MLeaderJigger3(new MLeader());
PromptResult pr;
do
{
pr = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.Drag(jigger);
if (pr.Status == PromptStatus.Keyword)
{
// Keyword handling code
}
else
{
jigger.mCurJigFactorIndex++;
}
} while (pr.Status != PromptStatus.Cancel && pr.Status != PromptStatus.Error && jigger.mCurJigFactorIndex <= 2);
if (pr.Status == PromptStatus.Cancel || pr.Status == PromptStatus.Error)
{
if (jigger != null && jigger.Entity != null)
jigger.Entity.Dispose();
return null;
}
return jigger.Entity;
}
catch(System.Exception ex)
{
MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
if (jigger != null && jigger.Entity != null)
jigger.Entity.Dispose();
return null;
}
}
#endregion
#region Test Commands
[CommandMethod("TestMLeaderJigger3")]
public static void TestMLeaderJigger3_Method()
{
try
{
Entity jigEnt = MLeaderJigger3.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:
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 and code here, or any wizards/coders/widgets of AcadNetAddinWizardPro helpful, please kindly make a donation.
Recent Comments